Debian.pro

Блог для пользователей и администраторов Debian


Большой Мануал: часть 2. Сносим всё дерьмо, которое принес хостер.

Эта статья — часть Большого Мануала по настройке lamp-сервера на debian.

Предыдущая статья цикла — Про vds/dedicated хостеров. Выбираем сервер.

Следующая статья цикла — /etc/apt/sources.list.

Нередко хостеры не позволяют налить машину из своего iso-образа. Самые продвинутые позволяют налить систему из захардкоженного списка iso-шников — с ними проще. Но вот у всех остальных система ставится из образа, приготовленного хостером. Есть в таких образах полезные вещи — драйвера к железу из коробки, какие-то там системы мониторинга, которые позволяют в панели рисовать клевые графички или присылать смс, если на сервере кончилась память (это во flops, кстати). Но в большинстве случаев хостер в шаблон кладет какое-нибудь дерьмо — ненастроенный apache, ntpd, самые фантазеры дадут вам машину «с настроенным LAMP» — всё это вам не нужно. Во-первых, можно потратить много времени на то, чтобы донастроить за хостером всё то, что он добавил в шаблон (это иногда нетривиально, к тому же), во-вторых — зачем нам какая-то ненужная хрень на сервере?


Поэтому сейчас мы будем учиться сносить всё лишнее. Для примера я взял виртуалку в digitalocean с «базовым» Debian 7 — даже там хватает ненужного.


Для начала посмотрим на то, что на самом деле debian-у нужно. Вот вам пример выхлопа ps aux на одном из моих серверов (единственная его задача — быть dns-сервером)

root@server:~# ps aux
root@ns2:~# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  10444   812 ?        Ss   May12   0:02 init [2]      
root         2  0.0  0.0      0     0 ?        S    May12   0:00 [kthreadd/3325]
root         3  0.0  0.0      0     0 ?        S    May12   0:00 [khelper/3325]
root       430  0.0  0.3  56664  1024 ?        Ss   May12   0:00 /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
root       432  0.0  0.2  56664   556 ?        S    May12   0:00 /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
root       440  0.0  0.2  10136   756 ?        Ss   May12   0:10 /sbin/syslogd
bind       462  0.0  6.7 132140 17576 ?        Ssl  May12   0:14 /usr/sbin/named -u bind
root       490  0.0  0.3  23000  1012 ?        Ss   May12   0:00 /usr/sbin/cron
root       521  0.0  0.8  58136  2112 ?        Ss   May12   0:08 sendmail: MTA: accepting connections          
root       543  0.0  0.4  51276  1192 ?        Ss   May12   0:07 /usr/sbin/sshd
root      8050  0.0  1.4  81104  3796 ?        Ss   19:47   0:00 sshd: root@ttyp0 
root      8052  0.0  0.7  19808  1916 ttyp0    Ss   19:47   0:00 -bash
root      8058  0.0  1.2  79736  3332 ?        Ss   19:48   0:00 sshd: root [priv]
sshd      8059  0.0  0.5  52620  1456 ?        S    19:48   0:00 sshd: root [net] 
root      8061  0.0  0.4  18976  1100 ttyp0    R+   19:48   0:00 ps aux

Каждый процесс мне здесь понятен, запущенная система занимает 21 мегабайт памяти.

А теперь посмотрим на «чистую» систему в digitalocean:

root@server:~# root@test:~# ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:00 init [2]  
...
  281 ?        Ss     0:00 udevd --daemon
 1844 ?        Sl     0:00 /usr/sbin/rsyslogd -c5
 1897 ?        Ss     0:00 /usr/sbin/atd
 1906 ?        Ss     0:00 /usr/sbin/acpid
 1908 ?        Ss     0:00 /usr/sbin/anacron -s
 2007 ?        Ss     0:00 /usr/sbin/cron
 2027 ?        Ss     0:00 /usr/bin/dbus-daemon --system
 2110 ?        Ss     0:00 /usr/sbin/sshd
 2316 ?        Ss     0:00 /usr/sbin/exim4 -bd -q30m
 2345 tty1     Ss+    0:00 /sbin/getty 38400 tty1
 2346 tty2     Ss+    0:00 /sbin/getty 38400 tty2
 2347 tty3     Ss+    0:00 /sbin/getty 38400 tty3
 2348 tty4     Ss+    0:00 /sbin/getty 38400 tty4
 2349 tty5     Ss+    0:00 /sbin/getty 38400 tty5
 2350 tty6     Ss+    0:00 /sbin/getty 38400 tty6
 2352 ?        Ss     0:00 sshd: root@pts/1 
 2355 ?        Sl     0:00 /usr/sbin/console-kit-daemon --no-daemon
 2424 pts/1    Ss     0:00 -bash
 2473 pts/1    R+     0:00 ps ax

Там, где … — ядерные процессы, мы с ничего делать не будем (обозначаются как [something] в выводе ps ax).
Давайте рассуждать. init — процесс нужный, тут не поспоришь.
udevd отвечает за управлением железом (в том числе, и виртуальным). Пригодится.
А вот мы встретили rsyslog, он нам непонятен. Идем в гугл с запросом «linux what is rsyslog». Ага, в эту штуку система пишет логи, тоже оставим. Но вот если бы был syslog-ng — мы бы его заменили на rsyslog, он полегче (не такой фичастый, зато памяти меньше ест).
Гуглим про atd. Какой-то там планировщик одноразовых задач на определенное время (ей б-гу, я им пользовался за 7 лет 2 раза). Вот когда понадобится — тогда и поставим. А пока снесем.
Для начала попробуем найти, где он. Процесс называется atd, спросим у dpkg, что он знает про файлы с таким названием:

root@server:~# dpkg -S atd
at: /etc/pam.d/atd
at: /etc/init.d/atd
at: /usr/sbin/atd
linux-image-3.2.0-4-amd64: /lib/modules/3.2.0-4-amd64/kernel/drivers/dma/ioat/ioatdma.ko
at: /usr/share/man/man8/atd.8.gz

Вряд ли утилита at daemon живет в пакете linux-image. А вот пакет at — похож на правду. Сносим его:

root@server:~# apt-get remove --purge at
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
at*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 103 kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 26343 files and directories currently installed.)
Removing at ...
[ ok ] Stopping deferred execution scheduler: atd.
Purging configuration files for at ...
Processing triggers for man-db ...



Так, что там у нас следующее? acpid. Вроде, какая-то штука про управление питанием в Linux. Пожалуй, оставим.
anacron и cron. Запуск задач по расписанию. Вообще штуки полезные и нам пригодятся. Я бы снес anacron, но некоторые пакеты зависят от него — они запускают что-то через anacron, а не cron, так что пусть живет.
dbus — гуглим, тоже что-то важное. Оставляем.
sshd — ssh-daemon. Пожалуй, имея доступ только через ssh на сервер, сносить его будет плохой идеей.
А следующий у нас — exim. Почтовый сервер, конфигурация которого нам неизвестна. Отличненько! Но нам-то хочется, чтобы конфигурация exim-a была известной, чтобы через нас спам пройти не мог.
Попробуем найти все пакеты про exim:

root@server:~# dpkg -l | grep exim
ii  exim4                              4.80-7+deb7u1                 all          metapackage to ease Exim MTA (v4) installation
ii  exim4-base                         4.80-7+deb7u1                 amd64        support files for all Exim MTA (v4) packages
ii  exim4-config                       4.80-7+deb7u1                 all          configuration for the Exim MTA (v4)
ii  exim4-daemon-light                 4.80-7+deb7u1                 amd64        lightweight Exim MTA (v4) daemon

Угу, пробуем снести:

root@server:~# root@test:~# apt-get remove --purge exim4 exim4-base exim4-config exim4-daemon-light
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
bsd-mailx* exim4* exim4-base* exim4-config* exim4-daemon-light*
0 upgraded, 0 newly installed, 5 to remove and 0 not upgraded.
After this operation, 4,061 kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 26319 files and directories currently installed.)
Removing bsd-mailx ...
Purging configuration files for bsd-mailx ...
Removing exim4 ...
Purging configuration files for exim4 ...
Removing exim4-daemon-light ...
[ ok ] Stopping MTA: exim4_listener.
Purging configuration files for exim4-daemon-light ...
Removing exim4-base ...
Purging configuration files for exim4-base ...
Removing exim4-config ...
Purging configuration files for exim4-config ...
dpkg-statoverride: warning: no override present
Processing triggers for man-db ...

Вроде бы получилось.
А что если не получилось бы? Мы можем переустановить конфиги пакета, не снося сам пакет. Правда, apt этого делать не умеет (apt-get install —reinstall не в счет).
Поэтому нам понадобятся deb-файлы:

root@server:~# apt-get download exim4 exim4-base exim4-config exim4-daemon-light

Проверим, что они появились в текущем каталоге:

root@server:~# ls
exim4_4.80-7+deb7u1_all.deb exim4-base_4.80-7+deb7u1_amd64.deb exim4-config_4.80-7+deb7u1_all.deb exim4-daemon-light_4.80-7+deb7u1_amd64.deb

Сойдет.
Теперь мы можем привести конфигурацию этих пакетов к дефолтной:

root@server:~# dpkg -i --force-confmiss exim4_4.80-7+deb7u1_all.deb exim4-base_4.80-7+deb7u1_amd64.deb exim4-config_4.80-7+deb7u1_all.deb exim4-daemon-light_4.80-7+deb7u1_amd64.deb

По крайней мере, так мы восстановим те конфиги, которые хостер удалил (бывает у них) после установки пакета.


Ребутаемся, смотрим — система занимает 26 мегабайт. Окей, 5 мегабайт — это разница между sendmail и exim.
А в списке запущенных процессов (за вычетом ядерных) у нас около 20 процессов. Прекрасно, здесь уже можно работать.

Стоит проверить ещё и список установленных пакетов, его можно посмотреть такой командой:

root@server:~# dpkg -l

Конечно, весь его прочитать не получится, но поискать там все упоминания известного вам софта (apache, php, *sql, smb, ftp и так далее) стоит, чтобы не оказаться в ситуации, когда вы стараетесь настроить заведомо неправильно настроенный демон.

Например, я снёс вот эти пакеты:

root@server:~# apt-get remove --purge tcpdump sudo w3m whois traceroute rsync parted ntpdate netcat nano manpages man-db acl aptitude arping avahi-daemon eject ftp fuse git git-man

tcpdump — вещь ситуативная, её можно поставить, когда понадобится
sudo — потом поставлю и настрою, мало ли что там хостер в sudo вписал.
w3m — вообще консольный браузер. Полезная штука, но вряд ли я им воспользуюсь именно на этом сервере.
whois — ну э… я с ноутбука whois домена посмотреть могу (у меня там такой же пакет есть, ага).
traceroute — тоже ситуативная вещь, на практике на 80% серверов его никогда не запускают.
rsync — когда понадобится — поставлю.
parted — вот уж работать с партициями дисков на виртуалке мне точно не придется.
ntpdate — сносим на всякий, потом поставим и настроим.
netcat — понадобится — поставим. Вообще-то штука полезная, но я предпочитаю ту, что в пакете netcat-openbsd
nano — редактор, которым я не пользуюсь. В топку.
manpages, man-db — у меня есть, где почитать мануалы.
acl — вряд ли вы будете его использовать (а если будем, то и не сносим).
aptitude — apt (наконец-то) уже всё то же самое умеет.
arping — аналогично трейсроуту
avahi-daemon — кто вообще эту дрянь сюда положил?
eject — на виртуалке? Кхм.
ftp — стандартный консольный ftp клиент. Во-первых, есть lftp, во-вторых, можно поставить, когда понадобится
fuse — вот тоже как-то не собираюсь его использовать.
git, git-man — пока не нужны. А если нужны — вы знаете, что делать.

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

19.05.2015 byinkvizitor68sl|big-manual

Комментарии (2):

  1. yukra :

    «dpkg -i —force-confmiss …»
    Если где то в конфигах сказано «include /etc/foo.d/*.conf», и хостер туда положил какой-нить свой /etc/foo.d/hostername.conf то может получиться не совсем то, что мы изначально планировали. Правда как это красиво обойти я не знаю.

  2. Мда. Тоже верно =)

    Ну в таких случаях пурджить и смотреть, что нет сообщений вида «/etc/daemon: not removed, not empty». Не помню уже, как там именно, но смысл в том.

Написать комментарий