понедельник, 24 февраля 2014 г.

Настройка доступа к хостингу NIC.RU через SFTP (SSH FTP)

В этой заметке мы расскажем о том как организовать безопасный доступ к файлам на хостинге nic.ru (ru-center) посредством SFTP. Для начала давайте разберемся что это такое и для чего это нужно? Традиционно мы заливали файлы на хостинг и производили какие-то операции с этими файлами посредством обычного FTP клиента. В чем минусы этого способа? Дело в том что протокол FTP разрабатывался очень давно и передает данные по сети в открытом виде. Таким образом не исключена вероятность, что при использовании FTP клиента, например, в интернет-кафе или при выходе в интернет посредством любой открытой точки доступа - пароль передаваемый вашим FTP клиентом могут перехватить злоумышленники со всеми вытекающими отсюда последствиями. Помимо FTP, на nic.ru нам также доступен SSH, однако не все знают как с ним работать. Постараемся немного приоткрыть завесу этой тайны.

Итак, что же такое SFTP? SFTP (англ. SSH File Transfer Protocol) — протокол прикладного уровня, предназначенный для копирования и выполнения других операций с файлами поверх надёжного и безопасного соединения. Протокол разработан группой IETF как расширение к SSH-2, однако SFTP допускает реализацию и с использованием иных протоколов сеансового уровня.

Другими словами это FTP через SSH. Перед тем как мы перейдем непосредственно к настройке SFTP клиента, предлагаем вам ознакомиться со следующими статьями:

В качестве SFTP клиента можно взять FileZilla, WinSCP, плагин для Total Commander'а - sftp4tc, а также Far Manager 3. Именно его настройку мы с вами и рассмотрим.
  1. Запускаем Far Manager 3.
  2. Нажимаем Alt-F2 и выбираем в правой панели (или нажимаем Alt-F1 и выбираем в левой панели) - NetBox.
  3. Далее нажимаем Shift-F4 и создаем новую SFTP сессию:


После чего нажимаем Ok и соединяемся с нашим хостингом по защищенному каналу.

p.s. В целях безопасности не рекомендуем сохранять ваш пароль для SSH / FTP / SFTP в используемом вами клиенте, т.к. на данный момент существует достаточное количество вредоносного ПО, способного извлечь его оттуда. Ну а береженого, как известно, бог бережёт.


четверг, 6 февраля 2014 г.

IIS + FastCGI/PHP. Получение доступа к системному журналу событий (windows event log).

Сегодняшний мой пост будет коротким, т.к. продолжая работу на одним важным проектом, получилось так, что я не спал больше суток, и довольно специфичным. Речь пойдет о том, как из PHP скрипта под IIS получить доступ к журналу событий ОС Windows, а конкретнее, сделать в нем запись о наступившем событии. Для чего это может быть использовано? Думаю не для кого не секрет что в Windows есть такая замечательная штука, как планировщик заданий. Так вот, в последних серверный версиях ОС, есть возможность настроить выполнение какой-либо задачи в планировщике по возникновению события в системном журнале Windows.

Например, служба электропитания сообщает о том, что питание компьютера перешло в состоянии от батареи, реагируя на это событие, можно запустить скрипт, отправляющий SMS или E-Mail системному администратору. Или же, например, можно пойти дальше. Представим себе что в организации есть свой Web-сервер на базе IIS + PHP + MySQL и некий сайт / набор скриптов, выполняющийся на этом сервере. PHP скрипт может генерировать определенное событие в системном журнале Windows, которое мы можем обрабатывать в планировщике. Например, если сервер доступен извне, при запросе к скрипту http://shutdown.tld/index.php?command=1 должно осуществляться завершение работы сервера, ну или какие-то другие регламентные операции. Как это реализовать? Именно по той схеме, которую я и описал. Внутри скрипта index.php мы должны сгенерировать событие в системном журнале Windows, а в планировщике мы можем его обработать (понято, что пример приведен в образовательных целях, в реальной жизни никто не будет выключать сервер с помощью HTTP запроса, да еще и через запись событий в системный журнал). Тем неменее у меня возникла похожая задача и нужно было ее реализовать.

Сперва, давайте разберемся как сделать запись в системный журнал Windows из консоли:

eventcreate /L Application /T Information /SO "Web Control Service" /ID 1 /D "Получено внешнее событие отключения сервера."

При этом в журнале событий приложений создастся вот такое событие:


Обработку которого мы можем повесить в планировщике. Все хорошо, и казалось бы что нам мешает сделать вызов exec() или system() из php скрипта с этой же командой, чтобы получить желаемое событие в журнале. Однако - мешает. А именно то, что у пользователя IUSR от имени которого и отрабатывает PHP скрипт нет прав на запись в этот журнал. Ниже несколько крайне полезных ссылок описывающих эту проблему:

Собственно по последней я и познакомился с утилитой wevtutil с помощью которой можно задать права на чтение / запись в системный журнал для пользователя IUSR. Итак, что мы делаем:

  1. Определяем идентификатор учетной записи IURS, в моем случае им оказался S-1-5-17.
  2. Получаем текущие права на запись в журнал приложений - wevtutil gl system > C:\temp\out.txt
  3. Смотрим строку, которая начинается с channelAccess: O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x7;;;SO)(A;;0x3;;;IU)(A;;0x3;;;SU)(A;;0x3;;;S-1-5-3)(A;;0x3;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573) - это и есть текущие права.
  4. Добавляем в конец этой строки (A;;0x3;;;S-1-5-17), где 0x3 - это права на чтение и запись, а S-1-5-17 идентификатор учетки IUSR.
  5. Запускаем wevtutil sl Application /ca:O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x7;;;SO)(A;;0x3;;;IU)(A;;0x3;;;SU)(A;;0x3;;;S-1-5-3)(A;;0x3;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)(A;;0x3;;;S-1-5-17)
После чего пользователь IUSR имеет права на запись в журнал Application и мы в PHP-скрипте можем выполнить, к примеру, такую конструкцию:

<?php
exec('eventcreate /L Application /T Information /SO "Web Control Service" /ID 1 /D "Получено внешнее событие отключения сервера."'); ?>

Профит ;)