☰ Оглавление

Сразу после покупки VDS имеет смысл настроить самые чувствительные системы, настройка которых требует перезагрузки системы, а ошибка может стоить потери всех данных. Приступим.

Самая начальная настройка

Мы пока имеем только пользователя root. На этом этапе мы создадим простого пользователя, дадим ему необходимые права и закроем доступ пользователю root.

Эти действия надо делать самым первым делом. На этом этапе проще всего нечаянно потерять контроль над системой. В этом случае, вам, возможно, придётся просто переустановить виртуальную машину и начать всё сначала.

Создаём пользователя

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

useradd -D

Если всё нормально, то начинаем:

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

useradd a

Проверяем, что получилось

cat /etc/passwd
cat /etc/group

Теперь создаём $HOME и назначаем пароль:

mkdir /home/a
chown a:a /home/a
passwd a

Приводим в порядок пакеты

Первым делом:

apt-get -u upgrade

Иногда приходится искать пакет:

apt-cache search sudo

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

apt-get install sudo

Запускаем visudo

a ALL=(root:root) ALL

Теперь наш пользователь a может выполнять sudo с паролем.

Проверяем, можем ли мы подключиться обычным пользователем

ssh a@87.117.252.150
sudo bash

Закрываем вход для пользователя root

Правим /etc/ssh/sshd_config:

PermitRootLogin no

В случае острой паранойи можно отключить доступ по паролю (предварительно, настроив доступ по ключу и убедившись, что он работает)

PasswordAuthentication no

До этого ssh -v писал

debug1: Authentications that can continue: publickey,password

Теперь скрещиваем пальцы и перезапускаем sshd.

Проверям. При подключении пользователя видим:

debug1: Authentications that can continue: publickey

Пользователя root больше не пускает.

Создаём у пользователя минимально комфортные условия

[[~/.bash_profile]]:

. $HOME/.bashrc

[[.bashrc]]:

export EDITOR=joe
export LANG=ru_RU.utf8
export LESS=FRSXQ
export LESSCHARSET=utf-8
export PATH="$HOME/bin:$PATH"
export PS2="\[\e[4m\]>\[\e[0m\] "
export PS1="\[\e[32;1m\]\W\$\[\e[0m\] "

Естественно, всё по-вкусу.

С правами доступа разобрались, но у нас осталось ещё одно важное дело — iptables.

Настройка iptables

Лирика

Я не сторонник сложных решений на стороне iptables, думаю, что о безопасности мы уже достаточно позаботились. Здесь мы напишем самые простые правила, открывающие часть потов для входящих соединений.

Пишем правила

*filter
#### входящий трафик ####
# настраиваем lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# все установленные соединения работают
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# разрешаем входящие соединения на порты
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# ICMP ещё никого не убивал
-A INPUT -p icmp -j ACCEPT
# всех остальных явно реджектим
-A INPUT -j REJECT

#### исходящий ####
# разрешены любые соединения
-A OUTPUT -j ACCEPT

#### это нам не нужно ####
-A FORWARD -j REJECT
COMMIT

Сохраняем это всё в файл, скажем, new.

Осторожно включаем новые правила

Тут есть опасность остаться без сервера, отключив самого себя. Поэтому проявляем максимальную осторожность.

Во-первых, запускаем screen и работаем под ним.

Во-вторых, сохраняем текущие правила.

iptables-save >orig
cat orig

Теперь пробуем (под скрином!):

iptables-restore <new; sleep 60; iptables-restore <orig

Новые правила вступят в силу только на одну минуту. За эту минуту надо попробовать подключиться. Если что-то не работает, то через минуту всё восстановится к изначальному состоянию. На худой конец останется возможность перезагрузить сервер.

Если всё получилось, то устанавливаем новую таблицу правил в систему. Чтобы она применялась при загрузке.

Тут всё очень зависит от дистрибутива. В debian штатного способа нет. Поэтому делаем руками скрипт загрузки, кому как нравится. Я люблю так:

#!/bin/sh

cat <<'TABLE_HERE' | iptables-restore
# Generated by iptables-save v1.4.14 on Thu Nov 33 12:41:32 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
# Completed on Thu Nov 21 12:41:32 2013
# Generated by iptables-save v1.4.14 on Thu Nov 33 12:41:32 2013
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Thu Nov 21 12:41:32 2013
# Generated by iptables-save v1.4.14 on Thu Nov 33 12:41:32 2013
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Thu Nov 21 12:41:32 2013
TABLE_HERE

Этот код можно поставить в виде rc-скрипта или просто разместить в rc.local (что не есть круто, но вполне работоспособно).

Ребутимся и убеждаемся, что всё запускается правильно.

Осталось до-установить пакетиков, которых вам не хватает, возможно, доделать локализацию (vi /etc/locale.gen, locale-gen), и сервер готов.