Как я создал систему мониторинга за компьютерами на работе и перенес сервис на Amazon AWS

    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
    • 0
      Мне кажется вы переизобрели OCS Inventory
      Добавить пару плагинов типа
      https://github.com/PluginsOCSInventory-NG/winusers/releases и получится что ваша задача будет решена готовыми средствами
      • 0
        Это просто для инвентаризации? Тогда надо интегрировать с системами общего учета. И в чем отличие от бесплатной OCS Inventory, которая легко раскидывается через AD.

        Как создать MSI пакет для распространения через AD
        • 0
          Это просто для инвентаризации?

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

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

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

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

        • 0

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

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

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

          • –1
            Столько всего сделано- интересно почитать! Возьму на заметку =) Спасибо!
            • 0
              и сколько такое будет стоить после 12 месяцев?
              • 0
                ~70 долларов в месяц. это я еще с запасом взял
                • 0
                  я сейчас читаю про google app engine, там вроде деньги снимают только если есть запрос, у AWS нет что либо подобного? что бы за только за запрос платить, а не за VM, которая 90% времени ничего не делает?
                  • 0
                    смотря что. Например Amazon SES берет определенную плату за 1000 сообщений опять там условия могут меняться. В вашем случае за виртуалку установлена фиксированная цена в час. и им пофиг что она простаивает 90% времени
              • 0
                Система не интересна, но за мануал с картинками по AWS спасибо.
                • 0

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

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