Aug 14, 2016 - Настройка сервера

На днях решил обновить операционную систему на сервере. У меня там стояла уже старая Федора 20. При стандартном обновлении возникла ошибка, так что я решил всё снести и с нуля установить и настроить Федору 24.

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

Начало

Я использую виртуальную машину у хостинг-провайдера Digital Ocean. После создания новой виртуальной машины на почту приходит пароль от учетной записи root.

Залогиниться на сервер можно с помощью консоли на сайте Digital Ocean, либо по SSH. Пользователи Windows могут использовать SSH-клиент PuTTY. При первом входе необходимо сменить пароль.

Работать на сервере под учетной записью root не рекомендуется. Необходимо создать обычную учетную запись и дать ей право использовать команду sudo.

adduser alex                            #Создаем нового пользователя
passwd alex                             #Устанавливаем пароль
gpasswd -a alex wheel                   #Даем право использовать sudo

Установить несколько полезных программ:

dnf install mc nano mlocate

Обновить пакеты на всякий случай (и перезагрузиться после этого):

dnf update
reboot

Настройка SSH

Необходимо настроить вход в учетную запись по ключу вместо пароля. Это:

  • более безопасно - ключ длинее пароля, его сложнее взломать;
  • более удобно - не нужно помнить пароль.

Здесь подробно объясняется зачем это нужно, и как это настроить. Пользователи Windows могут сгенерировать ключи с помощью утилиты PuTTYgen. Здесь объясняется, как это сделать.

Вкратце резюме процедуры:

  • Сгенерировать открытый и закрытый ключи с помощью ssh-keygen или PuTTYgen.
  • Открытый ключ скопировать на сервер и добавить в конец файла ~/.ssh/authorized_keys в домашних папках учетных записей

Теперь нужно запретить вход по паролю и вход под учетной записью root. Для этого в файле /etc/ssh/sshd_config изменить параметры:

PasswordAuthentication no
PermitRootLogin no

Перезапустить службу:

systemctl restart sshd

Настройка часового пояса

Выполнить команду:

sudo ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Здесь подробнее.

Настройка файервола

Выполнить команды:

sudo dnf install iptables-services              #Устанавливаем пакет
sudo systemctl enable iptables                  #Устанавливаем службу в автозагрузку
sudo systemctl start iptables                   #Запускаем службу
sudo service iptables save                      #Сохраняем конфиг, установленный по умолчанию

Конфиг будет сохранен в файл /etc/sysconfig/iptables.

sudo iptables -F                                #Сбрасываем конфигурацию
sudo iptables -A INPUT -i lo -j ACCEPT          #Принимаем пакеты с локальной машины
sudo iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT  #Открываем порт 22 (SSH)
sudo iptables -P INPUT DROP                     #Устанавливаем режим по умолчанию для входящих пакетов
sudo service iptables save                      #Сохраняем конфиг

Здесь подробнее. А также раз, два, три.

Настройка Apache

Выполнить команды:

sudo dnf install httpd mod_ssl              #Устанавливаем пакеты
sudo systemctl enable httpd                 #Устанавливаем службу в автозагрузку
sudo systemctl start httpd                  #Запускаем службу

Главный конфиг Апача лежит в файле /etc/httpd/conf/httpd.conf. Его править не нужно.
Вместо этого все настройки необходимо поместить в отдельные файлы в папке /etc/httpd/conf.d.

Пример конфига /etc/httpd/conf.d/alexander-bobkov.conf:

<VirtualHost *:80>
    ServerName alexander-bobkov.ru

    DocumentRoot /opt/alexander-bobkov.ru

    <Directory "/opt/alexander-bobkov.ru">
        Options +MultiViews
        AllowOverride None
        Require all granted
    </Directory>

    ServerAdmin alexander.e.bobkov@gmail.com

    AddDefaultCharset UTF-8

    ErrorLog /var/log/httpd/alexander-bobkov.ru/error_log
    CustomLog /var/log/httpd/alexander-bobkov.ru/access_log combined
</VirtualHost>

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

Перезапускаем:

sudo systemctl restart httpd

Если нужно некоторый путь URL перенаправить на другую папку на диске, то можно использовать директиву
Alias внутри VirtualHost. Пример:

Alias "/terrain" "/opt/www/terrain"
<Directory "/opt/www/terrain">
    Require all granted
</Directory>

Также рекомендуется сделать редирект с www.sitename.ru на sitename.ru или наоборот.

  • В настройках DNS добавить А-запись со значением www и ip-адресом основного сайта. Обновление записей занимает время, несколько часов.
  • В конфиге создать ещё один VirtualHost с директивой Redirect:

      <VirtualHost *:80>
          ServerName www.alexander-bobkov.ru
          Redirect permanent / http://alexander-bobkov.ru
      </VirtualHost>
    

Настроить файервол. Выполнить команды:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT      #Открываем порт 80 (HTTP)
sudo service iptables save

Настройка PostgreSQL

Выполнить команды:

sudo dnf install postgresql-server postgresql-contrib   #Устанавливаем пакеты    
sudo dnf install postgis pgRouting                      #Устанавливаем дополнительные пакеты    
sudo postgresql-setup --initdb --unit postgresql        #Выполняем начальную настройку
sudo systemctl enable postgresql                        #Устанавливаем службу в автозагрузку
sudo systemctl start postgresql                         #Запускаем службу    

Чтобы начать настраивать PostgreSQL, войти под юзером postgres:

sudo -i -u postgres

В моем случае я заранее забекапил все настройки командой pg_dumpall. Восстановить настройки из бекапа командой:

psql -f db.out postgres                               #Выполняем скрипт из файла db.out

Для того чтобы сервер стал доступен извне, нужно выполнить 3 действия.

  1. Настроить файервол. Выполнить команды:

     sudo iptables -A INPUT -p tcp --dport 5432 -j ACCEPT      #Открываем порт 5432
     sudo service iptables save
    
  2. Изменить метод аутентификации. В файле /var/lib/pgsql/data/pg_hba.conf изменить:

     host    all             all             127.0.0.1/32            md5
     host    all             all             ::1/128                 md5
    

    и добавить строку:

     host    all             all             0.0.0.0/0               md5
    
  3. В файле /var/lib/pgsql/data/postgresql.conf изменить:

     listen_addresses = '*'
    

Подробнее здесь и здесь.

Настройка OpenVPN

OpenVPN нужен, чтобы играть с друзьями в игры по локальной сети и для других задач. Тема настройки OpenVPN необъятна. Будем считать, что ключи и конфиги уже есть. Здесь необходимый минимум, как запустить OpenVPN.

Выполнить команду:

yum install openvpn                                       #Устанавливаем пакеты

Скопировать ключи и конфиг для сервера в папку /etc/openvpn.

Включить ip-forwarding:

  1. В файл /etc/sysctl.conf дописать строку:

     echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    
  2. Выполнить команду:

     sudo sysctl -p
    

Настроить файервол. Выполнить команды:

sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -j REJECT
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo service iptables save

Запустить службу:

sudo systemctl enable openvpn@server                        #Устанавливаем службу в автозагрузку
sudo systemctl start openvpn@server                         #Запускаем службу    

Подробнее здесь и здесь.

Настройка HTTPS

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

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

Поэтому необходимо использовать ключи, выданные удостоверяющим центром (Certification authority), который проверяет соответствие между доменным именем сайта и адресом сервера. Обычно такие ключи стоят денег. Однако не так давно появился сайт Let’s Encrypt, который выдает такие ключи всем желающим.

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

Далее инструкция по настройке бота под Федорой 24 для веб-сервера Apache. Предварительные замечания:

  • Конфиги с секциями VirtualHost должны лежать в папке /etc/httpd/conf.d, причем на каждый файл только одна секция VirtualHost.
  • Должен быть установлен mod_ssl (см. выше).

Настроить файервол. Выполнить команды:

sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT         #Открываем порт 443 (HTTPS)
sudo service iptables save

Выполнить команды:

sudo dnf install certbot python-certbot-apache              #Устанавливаем пакеты

Запустите псевдографический интерфейс настройки бота:

sudo certbot --apache

В интерфейсе отметьте галочами нужные сайты. Бот автоматически внесет изменения в конфиги Апача.

Можно проверить, что HTTPS работает на сайте SSL Labs.

Теперь нужо настроить автоматическое обновление ключей каждые 90 дней. Для начала запустить тестовую проверку:

sudo certbot renew --dry-run

Если всё нормально, то добавить запись в cron. Запустить редактор:

sudo EDITOR=nano crontab -e

Добавить в файле строку:

0 3 * * * certbot renew --quiet         #запускать каждый день в 3 часа ночи
                                        #пустая строка

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

Комментировать

Jun 7, 2016 - HyExplorer

Скриншот HyExplorer

Осенью поучаствовал в интересном проекте, связанном с обработкой гиперспектральных снимков. Результатом моего участия стал HyExplorer - система сбора и управления гиперспектральными изображениями. Проект делался на базе МИИГАиКа при поддержке РФФИ.

Существуют сенсоры, которые позволяют делать съемку поверхности Земли сразу во многих спектральных каналах одновременно. Например, Hyperion снимает сразу 220 каналов. Для сравнения Landsat 8 снимает 11 каналов. Каждый тип поверхности имеет свой спектр отраженного света. Чем больше каналов, тем точнее мы можем определить по спектру тип поверхности: леса, болота, поля, городская застройка.

Сенсор Hyperion на спутнике EO-1 летает уже 16 лет. И за всё время наснимал больше 77 тыс. сцен. Искать нужные сцены можно с помощью официальных инструментов EarthExplorer и GLOVIS. Но они не очень удобные и медленные.

Поэтому мы скачали базу метаданных всех сцен Гипериона и залили в PostGIS на своем сервере. Далее я написал толстый клиент на Qt + osgEarth, который позволяет искать сцены по набору параметров, показывать найденные сцены и обзоры сцен на глобусе, а также запускать внешние скрипты для обработки гиперспектральных сцен.

Комментировать

Jun 6, 2016 - Ogre3D vs. OpenSceneGraph

Ogre3D

OpenSceneGraph

Джанник Хеллер опубликовал интересное сравнение движков OpenSceneGraph и Ogre3D. И тот, и другой - свободные движки с открытым исходным кодом и 15-летней историей, и сейчас являются конкурентами в этой нише.

Джанник - также один из главных разработчиков OpenMW, свободного римейка игры Morrowind. В прошлом году они отказались от использования Ogre3D и перешли на OpenSceneGraph. Но про OpenMW я ещё планирую написать отдельно подробнее.

Комментировать

Mar 16, 2016 - Введение в OpenGL (3)

Продолжаю готовить материалы по OpenGL: освещение, материал по шейдерам дополнил разделом про Uniform Buffer Object.

Mar 10, 2016 - Введение в OpenGL (2)

Продолжаю готовить материалы по OpenGL: шейдеры и преобразование координат.