Сразу после покупки 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
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
, думаю,
что о безопасности мы уже достаточно позаботились. Здесь мы напишем самые простые
правила, открывающие часть потов для входящих соединений.
*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
), и
сервер готов.