Для прогона тестов мы будем использовать Amazon EC2, но можно взять и Amazon LightSail, Digital Ocean, Vultr или другой сервис. Все они конфигурируются одинаково, так что выбирайте тот, который вам по душе.
Создаём публичный и приватный SSH-ключи
Сначала создадим пару ключей, которые понадобятся некоторым хостам при установке сервера. Этот и некоторые другие шаги можно пропустить, если вы решите создать свою пару ключей при запуске сервера на Amazon.
SSH-ключи мы будем создавать с помощью ssh-keygen.
$ ssh-keygen -t rsa -b 4096
В результате получим два файла: id_rsa и id_rsa.pub (приватный и публичный ключи). Никогда и никому не передавайте свой приватный ключ.
Подробную инструкцию по созданию ключей вы найдёте здесь.
Импорт публичного ключа в Amazon
Импортируем только что созданный публичный ключ в платформу Amazon.
- Заходим в консоль управления Amazon.
- Кликаем AWS services > Compute > EC2
- Кликаем на левое меню Network & Security > Key Pairs
- Кликаем «Import Key Pair» и загружаем публичный ключ (id_rsa.pub)
Создаём свою виртуальную машину
Установим в Amazon EC2 виртуальную машину под управлением Ubuntu. Настройка подробно описана здесь:
- Заходим в консоль управления Amazon.
- Кликаем AWS services > Compute > EC2
- Выбираем запускаемый экземпляр.
- Выбираем один из образов. В нашем случае это будет Ubuntu Server 16.04 LTS (HVM), с SSD-накопителем (но вы можете выбрать то, что вам больше подходит).
- Выбираем виртуальную машину (в соответствии с вашими нуждами). Кликаем «Review» и «Launch».
- Открываем новую вкладку и импортируем в Amazon созданный публичный ключ.
- Здесь нас попросят «выбрать существующую пару ключей или создать новую» («Select an existing key pair or create a new key pair»). Жмём «выбрать существующую» («Choose an existing key pair»). Выбираем ранее загруженный ключ.
- Кликаем «Launch Instances».
- Кликаем на ссылку виртуальной машины, которую мы только что создали.
Внимание: некоторые следующие шаги могут быть сконфигурированы на начальном экране Amazon. Но раз уж это общее руководство, которое можно использовать и для других сервисов, будем говорить о конфигурациях по умолчанию.
Подключаемся к новому серверу
Обращаемся к виртуальной машине по SSH.
Пишем в терминале:
$ ssh <USЕR>@<IP-ADDRЕSS> -p 22 -i <PATH-TO-PRIVАTЕ-KEY>
<USЕR>
: пользователь Linux-системы. В случае с Amazon используйте ubuntu, на других сервисах — root<IP-ADDRЕSS>
: IP-адрес созданной нами виртуальной машины. Это поле «Public DNS (IPv4)» во вкладке «Description» нашего сервера.<PATH-TO-PRIVATЕ-KEY>
: полный путь к сгенерированному ранее приватному ключу (например, /Users/flavio/.ssh/id_rsa).-i <PATH-TO-PRIVATЕ-KEY>
: это можно пропустить, если вы добавили ключ в свой SSH-агент.
Даём доступ новому пользователю
Создадим новый аккаунт пользователя по имени “wizard”:
$ sudo adduser wizard
Дадим “wizard” разрешение выполнять sudo. Откроем файл:
$ sudo nano /etc/sudoers.d/wizard
И зададим содержимое:
wizard ALL=(ALL) NOPASSWD:ALL
Создадим директории:
$ mkdir /home/wizard/.ssh
# create authorized_keys file and copy your public key here
$ nano /home/wizard/.ssh/authorized_keys
$ chown wizard /home/wizard/.ssh
$ chown wizard /home/wizard/.ssh/authorized_keys
Скопируем публичный ключ (PATH-TO-PUBLIC-KEY) и вставим в удалённый экземпляр /home/wizard/.ssh/authorized_keys. Настроим разрешения:
$ chmod 700 /home/wizard/.ssh
$ chmod 600 /home/wizard/.ssh/authorized_keys
Обеспечиваем безопасность
Обновляем все установленные пакеты.
$ sudo apt-get update
$ sudo apt-get upgrade
Меняем SSH-порт с 22 на 2201. Для конфигурирования файрвола (ufw, Uncomplicated Firewall, незатейливый файрвол) открываем файл /etc/ssh/sshd_config:
$ sudo nano /etc/ssh/sshd_config
и меняем эти данные:
Port 2201
PermitRootLogin no
PasswordAuthentication no
# add this to avoid problem with multiple sshd processes
ClientAliveInterval 600
ClientAliveCountMax 3
Перезапускаем SSH-сервис:
$ sudo service ssh restart
Конфигурируем Uncomplicated Firewall (UFW) так, чтобы пропускались только входящие подключения SSH (порт 2201), HTTP (порт 80) и NTP (порт 123).
# close all incoming ports
$ sudo ufw default deny incoming
# open all outgoing ports
$ sudo ufw default allow outgoing
# open ssh port
$ sudo ufw allow 2201/tcp
# open http port
$ sudo ufw allow 80/tcp
# open ntp port : to sync the clock of your machine
$ sudo ufw allow 123/udp
# turn on firewall
$ sudo ufw enable
Конфигурируем серверные часы
Устанавливаем в качестве локального часового пояса UTC:
$ sudo dpkg-reconfigure tzdata
Выбираем опцию ‘None of the Above’ и снова UTC.
Отключаемся и добавляем наш ключ в SSH-агент
Для отключения вводим:
$ exit
а потом добавляем ключ.
Добавляем в Amazon разрешения по порту
Это необходимо сделать в Amazon. Зададим SSH-порт, который будем использовать также на Amazon.
- Заходим в консоль управления Amazon.
- Кликаем AWS services > Compute > EC2
- Кликаем на левое меню Network & Security > Security Groups
- Выбираем группу безопасности, относящуюся к нашей виртуальной машине.
- Кликаем Action > Edit Inbound Rules
- Кликаем «добавить правило» («Add Rule») и задаём: Type: Custom TCP, Port Range: 2201, Source: 0.0.0.0/0 и Description: SSH
Подключаемся с новыми данными
Теперь вы можете подключиться к серверу по новому порту как новый пользователь:
$ ssh wizard@<IP-ADDRESS> -p 2201 -i <PATH-TO-PRIVATE-KEY>
Теперь у вас есть сервер, готовый обслуживать ваше приложение.
Комментарии (11)
Amet13
25.01.2018 17:29продуктиву
Ох как звучит некрасиво.
sudo nano /etc/sudoers.d/wizard
Лучше использовать visudo для редактирования sudo-файлов, он проверит его на ошибки прежде чем сохранить:
sudo visudo -f /etc/sudoers.d/wizard
sudo service ssh restart
2018 год на дворе, systemctl во все поля
systemctl restart ssh
Ну и самое главное.
веб-сервер
Это не веб-сервер, это просто чистый инстанс на амазоне с предустановленной убунтой, настроенным фаерволом и ssh, чтобы это было веб-сервером, нужно его установить и сконфигурировать собственно говоря веб-сервер.
dobriykot
25.01.2018 18:56+1Тыщу раз уже обсуждали, что менять порт SSH бесполезно. Зачем, какой профит?
fogx
26.01.2018 09:37Профит — отсутствие килотонн мусора в логах. Это не для безопасности делается.
kotomyava
26.01.2018 11:29-1Это совершенно надуманная проблема, а «решение» вызывает больше проблем, а у многих не очень думающих и иллюзию защищённости.
Вы же не перевешиваете веб сервер, например на 8888 какой-нибудь, хотя там в логах тоже полно мусора типа "/wp-admin"?fogx
26.01.2018 12:43Да, спасибо, хороший пример.
Сейчас в одну кучу валятся и реальные 404 ошибки сайта, и такие вот /wp-admin в бесчисленных вариациях. Это неудобно, важная информация тонет в шуме.
Если б была простая возможность их разделить — так же просто, как сменить номер порта в ssh — я бы, наверное, воспользовался.kotomyava
26.01.2018 13:06Это решается анализаторами логов, а также awk, grep и.т.п., а не перевешиванием сервиса на другой порт…
kotomyava
25.01.2018 23:02Совершенно какой-то бесполезный пост. Тут и 1/100 наверное нет из того, что надо сделать, а главное, вообще ничего нет о web сервере, кроме названия статьи.
Надо было бы озаглавить, как добавить ssh ключик, и авторизоваться с его помощью…
Дадим “wizard” разрешение выполнять sudo. Откроем файл:
$ sudo nano /etc/sudoers.d/wizard
И зададим содержимое:
wizard ALL=(ALL) NOPASSWD:ALL
Почему NOPASSWORD?
Перенос на 2201 порт ssh, совершенно наивная и бесполезная мера.
В общем, не статья а позорище какое-то, и себе же антиреклама.
rt3879439
И ни слова про fail2ban, настройку web сервера, sql, права и best practices.
Слишком жидковато даже для линкс-бложика.