image
Здравствуй, уважаемый %user%. Сегодня я расскажу о том, как я написал простую систему позволяющую получать конфигурацию компьютеров и информацию о том, кто залогинился на компьютерах на работе, и как я перенес ее на Amazon AWS, сделав сервис для общего пользования. Данную статью так же можно считать отчасти подробным руководством о том как поднять свой веб сервер, почту, рассылку писем и правильно настроить его на Amazon AWS. И да эту статью можно отнести к категории – я пиарюсь. Кому стало интересно добро пожаловать под кат. Осторожно будет очень много скриншотов.


Предыстория


Однажды к нам в хелпдеск поступил звонок от заведующего складом. Ответил на его звонок я. Он спросил у меня о том что, можно ли найти компьютер по серийному номеру. Он не мог найти, кто этим компьютером пользуется, на что я ответил это конечно невозможно. Этот разговор навел меня на мысль, а что если создать систему, в которой показывалась бы вся конфигурация компьютера, включая его серийный номер и кто на нем залогинился. Написать клиентское приложение на C#, отправлять все на веб сервер с простеньким интерфейсом для контроля над всем этим.

Серверная часть


Попросил системных администраторов выделить отдельный сервер на Windows Server 2012 R2. Установил на него XAMPP. Добавил Apache и Mysql в службы, чтобы в случае перезагрузки сервера сайт не полег. Создал базу данных «opermon», добавил таблицы.
Веб интерфейс написан с помощью самописного mvc движка. Структура проекта:
  • Configs – здесь хранится конфигурационный файл для связи с БД
  • Controllers – здесь хранятся классы
  • Locale — локализация
  • Views – сами страницы, со стилями, картинками и javascript-ами


В корневой папке создадим файл index.php напишем код:
<?php
	session_start();
	spl_autoload_register(function ($class){
		include './app/controllers/' . $class . '.php';
	});
	
	$api = new Api($_GET);
	$controller = new Controller($_GET, $_POST);
?>


В папке Controllers есть много классов описывающих поведение системы. Одним из важных классов является класс Controller.php. Этот класс является контроллером, который принимает GET и POST запросы в __construct($get, $post) из index.php. Получив определенный запрос он показывает определенную страницу.
Класс Api служит для получения ajax запросов и обработку их. Консоль управления системы загружается всего лишь один раз. Все последующие действия осуществляются с помощью javascript и ajax запросов.

Дизайном системы я вдохновился от Microsoft Azure. Нижу приведу скриншоты финального результата:
Скриншоты
image

image

image

image

image

image


Следует отметить, что перед тем как сделать коммерческую версию на Amazon AWS, я полностью переписал систему сделав ее более безопасной, ориентированной на общее использование и часть функций просто убрал из-за ненадобности, но суть осталась одна и та же.

Клиентская часть


Клиентская часть данной системы – это простое приложение службы написанное на c#. При загрузке служба открывает файл конфигурации расположенное по адресу %windows_path%\OperMonitorSystem.xml. Структура данного xml файла:
<OperMonitorSystem>
	<Server>http://servername/</Server>
</OperMonitorSystem>


Чтобы служба могла отлавливать события сессии пользователя, следует добавить в инициализацию службы:
this.CanHandleSessionChangeEvent = true;


Следует добавить функцию, которая отлавливает изменения сессии:
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    switch (changeDescription.Reason)
    {
        case SessionChangeReason.SessionLogon:
            //ваше действие
            break;
        case SessionChangeReason.SessionLogoff:
            //ваше действие
            break;
        case SessionChangeReason.SessionLock:
            //ваше действие
            break;
        case SessionChangeReason.SessionUnlock:
            //ваше действие
        case SessionChangeReason.RemoteConnect:
            //ваше действие
        case SessionChangeReason.RemoteDisconnect:
            //ваше действие
    }
    base.OnSessionChange(changeDescription);
}


Используя класс WebClient на сервер отправляется POST запрос. Для получения конфигурации компьютера используются WMI запросы.
Клиентскую часть можно установить вручную на каждый компьютер (если их не много) или развернуть по групповой политике.
Идея о создании сервиса возникла после того как я написал эту статью, а если точнее после этих комментариев:
image

Во время переписывания системы прошлось ввести некий уникальный код для каждого пользователя – hashid. Это некая последовательность случайных цифр и букв записанных через тире, которая создается один раз при регистрации пользователя. Hashid по виду очень напоминает серийный ключ операционных систем семейства Windows. Каждому пользователю после оплаты нужной подписки скидывается установщик, в котором прописан его уникальный hashid. Именно по этому hashid в БД заносятся данные и это даст гарантию того, что посторонний пользователь не сможет увидеть компьютеры другого пользователя.

Систему я решил поставить на Amazon AWS. Amazon AWS дает год бесплатного пользования всеми возможностями системы, конечно не без ограничений. Регистрируемся на Amazon AWS. Во время регистрации к вам на мобильный телефон придет звонок для подтверждения аккаунта. Во время звонка вы должны будете набрать цифры на телефоне. К сожалению регистрация таким образом у меня не получилась. Я набирал требуемые цифры, но автоответчик все требовал набрать цифры и ничего не происходило. Тогда я обратился к службе поддержки, описал им свою ситуацию. Они назначили проверку личности по звонку с работником поддержки. Вскоре мне позвонил работник поддержки удостоверился что это я и подтвердил мой аккаунт. Следует отметить, что тех поддержка Amazon очень вежливая и лояльна к пользователям. Переходим к самому интересному – настройке Amazon AWS. Все что написано ниже мне удавалось путем долгих поисков проб и ошибок. Пользуясь этим руководством можно полностью все настроить и поднять не прибегая к поиску или еще чего-то.

Настройка Amazon AWS



Route 53


Сперва нам нужно купить доменное имя. Я выбрал opermon.com. Почему именно opermon:
  • Oper – от слова operator
  • Mon – от слова monitor


  1. Заходим на Route 53
    image
  2. Нажимаем на кнопку “Create Hosted Zone”. Справа в меню вписываем адрес, комментарий и выбираем “Public Hosted Zone”. Public Hosted Zone – означает, что имя написанное вами будет доступно всему миру. Следует отметить что аренда доменного имени в Amazon AWS обходится разными ценами. В моем случае обошлось в 12 американских долларов. Оплачивается раз в год. В течении 24 часов доменное имя уже будет готово к использованию.
    image


Amazon EC2


  1. Заходим в EC2
    image
  2. Выбираем пункт справа «Instances»
    image
  3. Нажимаем “Launch Instance”
    image
  4. Ставим галочку «Free tier only» и выбираем «Select» как показано на скриншоте.
    image
  5. Нажимаем «Next: Configure Instance Details»
    image
  6. Нажимаем «Next: Add storage»
    image
  7. Указываем размер диска. В моем случае 8 гигабайт хватает. Нажимаем «Next: Add tags»
    image
  8. Нажимаем «Next: Configure Security Group»
    image
  9. Нажимаем «Add new rule». Выбираем из списка HTTP, Source выбираем Anywhere. Данная процедура нужна чтобы, когда мы установили на нашем сервере apache, то снаружи был бы доступ к нашему веб сайту. Нажимаем «Review and Launch».
    image
  10. Нажимаем на кнопку «Launch».
    image
  11. В данном окне выбираем из выпадающего списка «Create a new key pair», вводим имя и нажимаем на кнопку «Download Key Pair». После чего кнопка «Launch Instances» станет активной. Скачанный .pem файл нужно скопировать на разные места для хранения. Терять данный файл ни в коем случае нельзя. Используя этот pem файл мы будем подключаться к нашему инстансу через WinSCP и Putty (далее в статье будет описание как их настроить).
    image
  12. Через 5 минут наш сервер поднимется и мы сможем к нему подключиться. Стандартная учетная запись «ec2-user». Настроим так чтобы при наборе адреса в браузере, открывался веб-сайт поднятый(далее будет описание как его настроить) на нашем серваке. Переходим в раздел «Instances», выбираем виртуальную машину, которую мы только что создали и смотрим на «Public DNS» и Public IPv4 адрес. У меня выглядит это так:
    image
    Скопируем себе это данные. Сейчас он нам понадобятся
  13. Заходим на Route 53. Выбираем купленный нами домен. Выбираем первую A запись. В правом меню добавляем Public IPv4 адрес нашего инстанса.
    image
  14. Нажимаем «Create record set». В правом открывшемся боковом меню из списка выбираем «Cname — canonical name». В поле «Name» вписываем «www». В поле «Value» вписываем «Public DNS» адрес нашего инстанса и нажимаем «Create»
    image


Изменения вступят в силу в течении 24 часов.

Настроим приложение Putty и WinSCP


Начнем с Putty. Скачиваем Putty на компьютер и устанавливаем его.

  1. Открываем сперва Puttygen (приложение находится в меню пуск, в папке Putty). Нажимаем «Load» и выбираем .pem файл, которого мы скачали когда поднимали EC2 инстанс:
    image
    image
    image
  2. Нажимаем на кнопку «Save private key» и сохраняем файл
    image
  3. Открываем Putty. В «Host name» записываем «Ip» адрес или «Public dns» адрес инстанса
    image
  4. Слева в меню выбираем раздел Connection->SSH->Auth и выбираем .ppk файл, которого мы только что создали в Puttygen.
    image
  5. Слева в меню заходим в раздел Session, вводим текст «linux» в поле «Saved sessions» и нажимаем на кнопку «Save». В списке сессий мы увидим, как добавилась «linux».
    image
  6. Таким образом следующий раз чтобы подключиться к серверу нам нужно будет просто выбрать только что сохраненную конфигурацию и нажать на кнопку Open.
    image


Перейдем к WinSCP. Скачиваем WinSCP на компьютер и устанавливаем его.
  1. В «Имя хоста» записываем «Ip» адрес или «Public dns» адрес инстанса. Имя пользователя вводим «ec2-user». Пароль оставляем пустым. Нажимаем на кнопку «Ещё»
    image
  2. В меню Аутентификация выбираем .ppk файл и нажимаем «ОК»
    image
  3. Нажимаем на кнопку «Сохранить» чтобы следующий раз не настраивали подключение. Мы увидим, как слева в меню добавилось подключение
    image


Amazon RDS


Создадим реляционную базу данных mysql.

  1. Открываем Amazon RDS
    image
  2. Нажимаем на кнопку «Select»
    image
  3. Выбираем Dev/Test, и нажимаем «Next Step»
    image
  4. Вводим идентификатор базы данных (у меня opermon), имя пользователя и пароль. Нажимаем «Next step»
    image
  5. Выбираем VPC, который создался при создании EC2 инстанса, задаем имя нашей БД и нажимаем «Launch DB instance»
    image
  6. Перейдем в консоль управления RDS в раздел «Instances». Через 5 минут наша база данных станет доступной и на месте Endpoint будет написан адрес нашего БД. Он нам понадобится.
    image


Настраиваем наш инстанс


Открываем Putty и подключаемся к нашему инстансу

  1. Устанавливаем apache
    sudo yum install -y httpd24 php56 php56-mysqlnd
    

  2. После установки запускаем его
    sudo service httpd start
    

  3. Даем доступ себе в папку www
    sudo groupadd www
    sudo usermod -a -G www ec2-user
    

  4. Выходим из программы Putty и заново подключаемся к нашему инстансу и задаем команды
    sudo chmod 2775 /var/www
    find /var/www -type d -exec sudo chmod 2775 {} +
    find /var/www -type f -exec sudo chmod 0664 {} +
    


Теперь в WinSCP мы можем заходить в директорию /var/www/ и загружать туда наш веб-сайт, движок, html – да что угодно.

Устанавливаем phpmyadmin


Открываем Putty и подключаемся к нашему инстансу

  1. Устанавливаем phpmyadmin
    sudo yum-config-manager --enable epel
    sudo yum install -y phpMyAdmin
    

  2. Находим свой внешний ip пользуясь посторонними сервисами и пишем команду
    sudo sed -i -e 's/127.0.0.1/ваш_айпи_адрес/g' /etc/httpd/conf.d/phpMyAdmin.conf
    

    Если ваш ip поменялся, то пишем команду
    sudo tail -n 1 /var/log/httpd/access_log | awk '{ print $1 }'
    здесь_будет_ваш_старый_айпи
    
    sudo sed -i -e 's/ваш_старый_айпи/новый_айпи/g' /etc/httpd/conf.d/phpMyAdmin.conf
    

  3. Перезагружаем apache сервер чтобы изменения вступили в силу
    sudo service httpd restart
    

  4. Теперь нужно настроить phpmyadmin, чтобы он подключался к нашей БД
    sudo chmod -R 777 /etc/phpMyAdmin
    

  5. Открываем WinSCP, заходим по адресу /etc/phpmyadmin копируем себе файл config.inc.php и открываем его в любом текстовом редакторе. Находим показанные ниже строки и меняем их на свои:
    
    $cfg['Servers'][$i]['host']          = 'Endpoint адрес нашей БД без порта';
    $cfg['Servers'][$i]['port']          = '3306';
    $cfg['Servers'][$i]['user']          = 'имя пользователя';
    $cfg['Servers'][$i]['password']      = 'пароль';
    

  6. Сохраняем файл и перезаписываем его на сервер. Выйдет ошибка о том, что файл перезаписан, но атрибуты изменены не были. Нажимаем «пропустить» и вводим команду в Putty:
    sudo chmod -R 755 /etc/phpMyAdmin
    

    Если эту команду не сделать, то Phpmyadmin откажется открываться ссылаясь на то, что права доступа на файлы были изменены и не соответствуют политике безопасности.


Настроим WorkMail


Что такое WorkMail?
Amazon WorkMail – это надежный управляемый сервис для деловой электронной почты и календарей с поддержкой существующих почтовых клиентов для настольных компьютеров и мобильных почтовых клиентов. Amazon WorkMail дает пользователям возможность беспрепятственно получать доступ к своей электронной почте, контактам и календарям с помощью удобного почтового клиента, включая Microsoft Outlook, приложения электронной почты для iOS и Android, любые почтовые клиенты, поддерживающие протокол IMAP, а также непосредственно через веб-браузер.


  1. Сделаем поиск по консоли Amazon AWS и найдем WorkMail
    image
  2. Выбираем Add Organization
    image
  3. Нажимаем «Quick setup»
    image
  4. Вводим имя организации и нажимаем на «Create». В моем случае организация уже создана, поэтому я нажму на «opermon» в списке на втором скриншоте.
    image
  5. Переходим в раздел «Domains» и нажимаем «Add domain»
    image
  6. Вводим имя домена и нажимаем «Add domain»
    image
  7. Откроется страница, в которых все записи нужно вписать в Route 53, в настройках нашего доменного имени. Написать настройки я думаю вы сможете сами.
    image
    После этого возвращаемся сюда
  8. Переходим в раздел «Users» нажимаем «Create user»
    image
  9. Вводим имя, фамилию, отображаемое имя и нажимаем «Next step»
    image
  10. Задаем email адрес, из списка выбираем ваш домен.com, задаем пароль и нажимаем «Add user»
    image


Теперь мы можем зайти в почту зайдя в адрес ваш_домен.awsapps.com/mail.

Настроим Amazon SES


  1. Открываем Amazon SES, переходим в раздел «Domains» и нажимаем на «Verify a new domain». В открывшемся окне вводим адрес (В моем случае это opermon.com) и нажимаем на «Verify this domain»
    image
  2. Откроется данное окно. Данные записанные в этом окне нужно будет опять таки вписать в Route 53
    image
  3. Переходим в раздел Email addresses и нажимаем «Verify a New Email Address», вводим email адрес ранее созданный в WorkMail и нажимаем на «Verify This Email Address». Через некоторое время к нам на указанный адрес придет письмо с ссылкой подтверждения. Открываем почту и нажимаем на ссылку подтверждения. Данная процедура нужна, чтобы в служебных письмах посылаемых нашим веб сайтом, системой и прочим мы могли бы использовать созданный ранее в WorkMail-е адрес отправителя.
    image
  4. Переходим в раздел «Create my SMTP credentials». Адрес SMTP сервера следует записать где-то.
    image
  5. Нажимаем «Create»
    image
  6. Учетная запись создалась, копируем логин и пароль и храним где-то. Они нам тоже понадобятся.
    image


Настроим скрипт отправки писем


В своем самописном движке есть класс Mail. Выглядит он таким образом:

<?php
	require_once('app/class/mail/PHPMailerAutoload.php');
	
	class OpermonMail
	{
		public static function SendMail($subject = 'none', $email, $name, $surname, $text_body = '', $text_altbody = '')
		{
			$config = parse_ini_file('app/config/mail.ini');
			$mail = new PHPMailer;
			$mail->isSMTP();
			$mail->Host = $config['MAIL_HOST'];
			$mail->SMTPAuth = true;
			$mail->Username = $config['MAIL_USERNAME'];
			$mail->Password = $config['MAIL_PASSWORD'];
			$mail->SMTPSecure = 'ssl';
			$mail->Port = 465;
			$mail->setFrom($config['MAIL_SETFROMEMAIL'], $config['MAIL_SETFROMNAME']);
			$mail->addAddress($email, $name.' '.$surname);
			$mail->isHTML(true);
			$mail->Subject = $subject;
			$mail->Body    = $text_body;
			$mail->AltBody = $text_altbody;
			if(!$mail->send())
			{
				return $mail->ErrorInfo;
			}
			else
			{
				return true;
			}
		}
	}
?>


Как видно из кода используется PHPMailer. Сможете найти вы его на github-е.

И так наконец после этого всего, система заработала. При регистрации пользователям отправляется код подтверждения (не даром мы возились с Amazon SES и WorkMail), открывается сам веб-сайт(Amazon EC2 с установленным на нем apache) и можно видеть записи в БД (phpmyadmin). Прилагаю скриншоты готовой системы:
Результат ради чего мы столько бились
image

image

image

image

image


К большому сожалению как сделать сбор установщика в самой системе я не знаю. Плюс в стране в, которой я живу не поддерживается тип бизнес аккаунта PayPal, поэтому не смог написать функцию оплаты прямо в системе. Эти аспекты я вынужден делать вручную.

Спасибо всем за внимание!

Комментарии (18)


  1. MetaDone
    24.08.2017 09:31

    Мне кажется вы переизобрели OCS Inventory
    Добавить пару плагинов типа
    https://github.com/PluginsOCSInventory-NG/winusers/releases и получится что ваша задача будет решена готовыми средствами


  1. fleaump
    24.08.2017 09:59

    Это просто для инвентаризации? Тогда надо интегрировать с системами общего учета. И в чем отличие от бесплатной OCS Inventory, которая легко раскидывается через AD.

    Как создать MSI пакет для распространения через AD


    1. AkshinM Автор
      25.08.2017 23:36

      Это просто для инвентаризации?

      для себя тоже. иногда пользователь отдаленный от компьютерных знаний не может сказать имя компьютера. приходится самому искать по логину.

      Как создать MSI пакет для распространения через AD

      MSI установщик клиентской части приложения есть. просто я не знаю как сделать так чтобы пользователи сами могли бы через веб-сайт собирать для себя установщик тупо нажав одну кнопку


  1. jtiq
    24.08.2017 20:42

    Больше похож на "Я пиарюсь" и/или какой-то мануал со скринами


    1. AkshinM Автор
      24.08.2017 20:56

      так и есть


  1. CheBurashka
    24.08.2017 20:42

    Пока читал никак не покидала мысль — а почему не glpi в паре с fusioninventory? Почему своё стали пилить?


    1. AkshinM Автор
      24.08.2017 20:56

      я даже не знал о существовании такого, да и самописное более под контролем чтоли


  1. modjo
    24.08.2017 20:42

    Вам не кажется, что вы написали Zabbix ?


    1. AkshinM Автор
      24.08.2017 20:57

      Zabbix — а что это такое?


      1. alexey-kirilenko
        25.08.2017 14:56

        вы шутите?


        1. AkshinM Автор
          25.08.2017 16:22

          Нет


  1. San911mustday
    24.08.2017 20:42
    -1

    Столько всего сделано- интересно почитать! Возьму на заметку =) Спасибо!


  1. Yo1
    24.08.2017 20:42

    и сколько такое будет стоить после 12 месяцев?


    1. AkshinM Автор
      24.08.2017 20:43

      ~70 долларов в месяц. это я еще с запасом взял


      1. Yo1
        25.08.2017 00:04

        я сейчас читаю про google app engine, там вроде деньги снимают только если есть запрос, у AWS нет что либо подобного? что бы за только за запрос платить, а не за VM, которая 90% времени ничего не делает?


        1. AkshinM Автор
          25.08.2017 00:24

          смотря что. Например Amazon SES берет определенную плату за 1000 сообщений опять там условия могут меняться. В вашем случае за виртуалку установлена фиксированная цена в час. и им пофиг что она простаивает 90% времени


  1. DeeZ
    25.08.2017 11:54

    Система не интересна, но за мануал с картинками по AWS спасибо.


    1. AkshinM Автор
      25.08.2017 16:21

      Всегда пожалуйста.
      Можете сказать причину по которой система не интересна, чтобы я знал в каком направлении мне ее улучшать?