Как ограничить доступ к файлу YML только Яндекс.Маркетом, чтобы посторонние лица не имели доступа к нему

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

14.03.2015 07:13

Ограничить доступ к файлу YML таким образом, чтобы этот файл был доступен только Яндекс.Маркету, но не был доступен посторонним лицам, можно стандартными средствами веб-сервера.

Эта инструкция предназначена для стандартного сервера.
Стандартный сервер использует в качестве веб-сервера nginx.
nginx позволяет ограничивать доступ к конкретным веб-адресам посредством своего стандартного модуля ngx_http_auth_basic_module.

Веб-адрес формируемого Российской сборкой Magento файла YML может быть разным, но он всегда содержит подстроку «df-yandex-market/yml», которую в то же время не содержит ни один другой веб-адрес Magento.
Таким образом, по наличию подстроки «df-yandex-market/yml» в запрашиваемом пользователем веб-адресе можно однозначно определить, запрашивает ли пользователь файл YML.
Поэтому правило для ограничения доступа к файлу YML можно сделать таким:
location ~ /df-yandex-market/yml.*$ { 
    auth_basic "";
    auth_basic_user_file htpasswd;  
}

Это правило надо добавить в файл с настройками интернет-магазина для nginx, который расположенг в папке /usr/local/nginx/conf/sites и называется доменным именем интернет-магазина с расширением *.conf, например example.ru.conf.
Указанное правило лучше всего вставлять сразу после другого аналогичного правила, которое уже в файле присутствует):
location /var/export/ { 
    auth_basic           "Restricted"; 
    auth_basic_user_file htpasswd; 
    autoindex            on;
}


После редактирования файла надо перезапустить nginx (чтобы он прочитал новые настройки).
Перезапустить nginx можно с командной строки от лица пользователя root, зайдя на сервер по протоколу SSH (например, посредством программы PuTTY).
Команда такая:
/etc/init.d/nginx restart


Затем надо создать файл htpasswd в папке /usr/local/nginx/conf и описать там пользователей, которые будут иметь доступ к файлу YML.
Самый простой способ — создать текстовый файл и поместить туда одну строку:
user:password

Вместо «user» укажите имя пользователя, а вместо «password» — пароль.

Затем укажите те же самые логин и пароль в Личном кабинете магазина в Яндекс.Маркете, чтобы Яндекс.Маркет их знал и получил доступ к файлу YML.

#2 Игорь Шмаков
  • Группа: Клиент
  • Сообщений: 42
  • Регистрация: 28.09.2014

26.03.2015 10:51

Использую стандартный сервер, в файле /usr/local/nginx/conf/sites/bonvagon.ru.conf был внесен соответствующий блок кода:
	location /var/export/ { ## Allow admins only to view export folder
		auth_basic           "Restricted"; ## Message shown in login window
		auth_basic_user_file htpasswd; ## See /etc/nginx/htpassword
		autoindex            on;
	}		
	
location ~ /df-yandex-market/yml.*$ { 
    auth_basic "";
    auth_basic_user_file htpasswd;  
}


после этого nginx был перезагружен, в папке /usr/local/nginx был создан файл htpasswd, в нем в качестве теста указан user:password

Окно авторизации появляется, но связка логин-пароль не подходит. Что я делаю не так?

#3 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

26.03.2015 14:45

Значением параметра auth_basic_user_file должен быть путь к файлу с паролями.
Этот путь может быть как абсолютным, так и относительным.
В официальной документации по ссылке выше почему-то не сказано, как именно рассчитывается относительный путь.
Однако в wiki к HttpAuthBasicModule сказано, что этот путь рассчитывается по-разному в зависимости от версии nginx:

«This directive sets the htpasswd filename for the authentication realm. Since version 0.6.7 the filename path is relative to directory of nginx configuration file nginx.conf, but not to nginx prefix directory.»

Учитывая, что версия nginx 0.6.7 вышла 7 с половиной лет назад (в августе 2007 года), можно игнорировать поведение системы до этой версии и считать, что относительный путь к файлу с паролями рассчитывается относительно файла nginx.conf.
Поэтому на стандартном сервере по инструкции выше файл с паролями надо помещать в папку /usr/local/nginx/conf (где и располагается файл nginx.conf), либо помещать в какую-то свою папку и указывать полный путь к файлу в значении параметра auth_basic_user_file.
Обновил инструкцию выше.

#4 Игорь Шмаков
  • Группа: Клиент
  • Сообщений: 42
  • Регистрация: 28.09.2014

31.03.2015 19:19

И все равно что-то идет не так.

Стоит отметить и , возможно, включить в инструкцию, что в файле htpasswd требуется пароль зашифрованный в md5.

Но даже после этого, когда становится очевидным, что система приняла связку логин-пароль, то по адресу example.ru/df-yandex-market/yml/ выдается ошибка "404 Not Found nginx/1.6.2". А если убрать из файла example.ru.conf наш кусок кода авторизации - по этому адресу нормально открывается yml-файл.

Таким образом, ограничить доступ становится возможным, но после авторизации по ссылке не оказывается yml-файла. Прошу решить это.

#5 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8884
  • Регистрация: 20.02.2010

31.03.2015 19:25

Пароль, зашифрованный md5, не требуется.
В угадайку играть не нужно.
Портить инструкцию своими догадками тоже не нужно.
Для своих конкретных проблем вместо порчи инструкции создавайте свои конкретные темы.

Поделиться темой: