Debian VPS: оптимізація і обробка напильником

Поки тішусь працюючим сервачком, натикнувся на звичні рутинні нюанси, які супроводжують діяльність подібних вузлів інтернету. В цьому пості мова піде про протидію брутфорсу FTP та ssh, варіант з torrent-клієнтом та оптимізацію використання оперативної пам’яті.

Вирішив переглянути логи, в auth.log натикнувся на знайомі рядки:

Jul  5 15:47:06 cs1281 sshd[11976]: Invalid user dedicated from 210.83.203.162
Jul  5 15:47:06 cs1281 sshd[11976]: pam_unix(sshd:auth): check pass; user unknown
Jul  5 15:47:06 cs1281 sshd[11976]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=21$
Jul  5 15:47:08 cs1281 sshd[11976]: Failed password for invalid user dedicated from 210.83.203.162 port 56922 ssh2
Jul  5 15:47:12 cs1281 sshd[12024]: Invalid user dedicated from 210.83.203.162
Jul  5 15:47:12 cs1281 sshd[12024]: pam_unix(sshd:auth): check pass; user unknown
Jul  5 15:47:12 cs1281 sshd[12024]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=21$
Jul  5 15:47:14 cs1281 sshd[12024]: Failed password for invalid user dedicated from 210.83.203.162 port 57047 ssh2
Jul  5 15:47:18 cs1281 sshd[12043]: Invalid user sysmanager from 210.83.203.162
Jul  5 15:47:18 cs1281 sshd[12043]: pam_unix(sshd:auth): check pass; user unknown
Jul  5 15:47:18 cs1281 sshd[12043]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=21$
Jul  5 15:47:20 cs1281 sshd[12043]: Failed password for invalid user sysmanager from 210.83.203.162 port 57158 ssh2
Jul  5 15:47:24 cs1281 sshd[12052]: Invalid user sysmanager from 210.83.203.162
Jul  5 15:47:24 cs1281 sshd[12052]: pam_unix(sshd:auth): check pass; user unknown

Ну і т.д., гм, най би собі вгадували юзера і пароль, але заїло то мене. З iptables не дуже подружився після того, як забанив сам себе. Тому порившись в aptitude, відшукав підходящий пакетик fail2ban. Установка проста

sudo apt-get fail2ban

Скрипт написаний на пітоні, висить резидентно, має простий доступний конфіг, приведу приклад свого /etc/fail2ban/jail.conf:

[DEFAULT]
 
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1
bantime  = 600
maxretry = 3
 
# "backend" specifies the backend used to get files modification. Available
# options are "gamin", "polling" and "auto".
# yoh: For some reason Debian shipped python-gamin didn't work as expected
#      This issue left ToDo, so polling is default backend for now
backend = polling
 
#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail =majesty@nashemisto.if.ua
 
#
# ACTIONS
#
 
# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overriden globally or per
# section within jail.local file
banaction = iptables-multiport
 
# email action. Since 0.8.1 upstream fail2ban uses sendmail
# MTA for the mailing. Change mta configuration parameter to mail
# if you want to revert to conventional 'mail'.
mta = sendmail
 
# Default protocol
protocol = tcp
 
#
# Action shortcuts. To be used to define action parameter
 
# The simplest action to take: ban only
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
 
# ban & send an e-mail with whois report to the destemail.
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
 
# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]
 
# Choose default action.  To change, just override value of 'action' with the
# interpolation to the chosen action shortcut (e.g.  action_mw, action_mwl, etc) in jail.local
# globally (section [DEFAULT]) or per specific section
action = %(action_)s
 
#
# JAILS
#
 
# Next jails corresponds to the standard configuration in Fail2ban 0.6 which
# was shipped in Debian. Enable any defined here jail by including
#
# [SECTION_NAME]
# enabled = true
 
#
# in /etc/fail2ban/jail.local.
#
# Optionally you may override any other parameter (e.g. banaction,
# action, port, logpath, etc) in that section within jail.local
 
[ssh]
 
enabled = true
port	= ssh
filter	= sshd
logpath  = /var/log/auth.log
maxretry = 6
 
# Generic filter for pam. Has to be used with action which bans all ports
# such as iptables-allports, shorewall
[pam-generic]
 
enabled = false
# pam-generic filter can be customized to monitor specific subset of 'tty's
filter	= pam-generic
# port actually must be irrelevant but lets leave it all for some possible uses
port = all
banaction = iptables-allports
port     = anyport
logpath  = /var/log/auth.log
maxretry = 6
 
[xinetd-fail]
 
enabled   = false
filter    = xinetd-fail
port      = all
banaction = iptables-multiport-log
logpath   = /var/log/daemon.log
maxretry  = 2
 
[ssh-ddos]
 
enabled = false
port    = ssh
filter  = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 6
 
#
# HTTP servers
#
 
[apache]
 
enabled = false
port	= http,https
filter	= apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
 
# default action is now multiport, so apache-multiport jail was left
# for compatibility with previous (<0.7.6-2) releases
[apache-multiport]
 
enabled   = false
port	  = http,https
filter	  = apache-auth
logpath   = /var/log/apache*/*error.log
maxretry  = 6
 
[apache-noscript]
 
enabled = false
port    = http,https
filter  = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 6
 
[apache-overflows]
 
enabled = false
port    = http,https
filter  = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 2
 
#
# FTP servers
#
 
[vsftpd]
 
enabled  = false
port	 = ftp,ftp-data,ftps,ftps-data
filter   = vsftpd
logpath  = /var/log/vsftpd.log
# or overwrite it in jails.local to be
# logpath = /var/log/auth.log
# if you want to rely on PAM failed login attempts
# vsftpd's failregex should match both of those formats
maxretry = 6
 
[proftpd]
 
enabled  = true
port	 = ftp,ftp-data,ftps,ftps-data
filter   = proftpd
logpath  = /var/log/proftpd/proftpd.log
maxretry = 6
 
[wuftpd]
 
enabled  = false
port	 = ftp,ftp-data,ftps,ftps-data
filter   = wuftpd
logpath  = /var/log/auth.log
maxretry = 6
 
#
# Mail servers
#
 
[postfix]
 
enabled  = false
port	 = smtp,ssmtp
filter   = postfix
logpath  = /var/log/mail.log
 
[couriersmtp]
 
enabled  = false
port	 = smtp,ssmtp
filter   = couriersmtp
logpath  = /var/log/mail.log
 
#
# Mail servers authenticators: might be used for smtp,ftp,imap servers, so
# all relevant ports get banned
#
 
[courierauth]
 
enabled  = false
port	 = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter   = courierlogin
logpath  = /var/log/mail.log
 
[sasl]
 
enabled  = true
port	 = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter   = sasl
logpath  = /var/log/mail.log
 
# DNS Servers
 
# These jails block attacks against named (bind9). By default, logging is off
# with bind9 installation. You will need something like this:
#
# logging {
#     channel security_file {
#         file "/var/log/named/security.log" versions 3 size 30m;
#         severity dynamic;
#         print-time yes;
#     };
#     category security {
#         security_file;
#     };
# }
#
# in your named.conf to provide proper logging
 
# Word of Caution:
# Given filter can lead to DoS attack against your DNS server
# since there is no way to assure that UDP packets come from the
# real source IP
[named-refused-udp]
 
enabled  = false
port     = domain,953
protocol = udp
filter   = named-refused
logpath  = /var/log/named/security.log
 
[named-refused-tcp]
 
enabled  = false
port     = domain,953
protocol = tcp
filter   = named-refused
logpath  = /var/log/named/security.log

Більшість дефолт, гарно документований, залишається лише в потрібних секціях покласти enabled=true для захисту по відповідних сервісах. Можна згадати, в /etc/fail2ban/action.d та /etc/fail2ban/filter.d розписані правила правила протидії та фільтрування відповідно, там все ніби адекватно, так що можна користуватись.

Наступну мутку придумав з торентами. Ніколи не користувався, і не мав потреби. Але, залишаючись фанатом старих комп’ютерних іграшок, схотілось знайти давні збірники, щоб мати. Знайшов якраз на torrents.ru, там багацько образів, разом понад 13 Гб. Нет в мене повільний, і качаю щось переважно в гостях. Та й вінт ssd, на який писати всякі штуки не зовсім здорово. З домашнього сервера через мобільний нет тягнути торент також збочення. Тут назріла ідея – розгорнути torrent-клієнт на сервер, стягати і роздавати з нього, керувати через веб-інтерфейс. А тоді вже по http або ftp можна потрохи качати прийняте.

Вибір зупинив на transmission. Напевне тому, що сподобався його GTK-інтерфейс. Гугл підказав про існування демона цього клієнта, який сі зове transmission-daemon, і ставиться з репозиторіїв.

Тут спіткала деяка невдача, в репах Debian Lenny не знайшлося пакета, тому довелось підключити від testing:

cat "deb http://ftp.nl.debian.org/debian testing main contrib non-free" /etc/apt/sources.list
 
apt-get update && apt-get upgrade && apt-get install transmission-daemon

Всьо файнюцько завелось, але потрібно спинити демона, бо інакше зміни конфіга не будуть мати сили – при виході файл конфігурації відновлюється.

/etc/init.d/transmission-daemon stop

Теперка можна відкривати файл /etc/transmission-daemon/settings.json , і правити його. Для мене оптимальний наступний зміст:

{
"alt-speed-down": 50,
"alt-speed-enabled": false,
"alt-speed-time-begin": 540,
"alt-speed-time-day": 127,
"alt-speed-time-enabled": false,
"alt-speed-time-end": 1020,
"alt-speed-up": 50,
"bind-address-ipv4": "0.0.0.0",
"bind-address-ipv6": "::",
"blocklist-enabled": false,
"dht-enabled": true,
"download-dir": "/var/www/srv.if.ua/torrents",
"download-limit": 100,
"download-limit-enabled": 0,
"encryption": 1,
"incomplete-dir": "/root/Downloads",
"incomplete-dir-enabled": false,
"lazy-bitfield-enabled": true,
"lpd-enabled": false,
"max-peers-global": 200,
"message-level": 2,
"open-file-limit": 32,
"peer-limit-global": 240,
"peer-limit-per-torrent": 60,
"peer-port": 51413,
"peer-port-random-high": 65535,
"peer-port-random-low": 49152,
"peer-port-random-on-start": false,
"peer-socket-tos": 0,
"pex-enabled": true,
"port-forwarding-enabled": false,
"preallocation": 1,
"proxy": "",
"proxy-auth-enabled": false,
"proxy-auth-password": "",
"proxy-auth-username": "",
"proxy-enabled": false,
"proxy-port": 80,
"proxy-type": 0,
"ratio-limit": 2.0000,
"ratio-limit-enabled": false,
"rename-partial-files": true,
"rpc-authentication-required": true,
"rpc-bind-address": "0.0.0.0",
"rpc-enabled": true,
"rpc-password": "{1cea26d5f2c9babd360c2c4c3cab37719849921dqWBhiRTX",
"rpc-port": 9000,
"rpc-username": "majesty",
"rpc-whitelist": "127.0.0.1",
"rpc-whitelist-enabled": false,
"script-torrent-done-enabled": false,
"script-torrent-done-filename": "",
"speed-limit-down": 100,
"speed-limit-down-enabled": false,
"speed-limit-up": 100,
"speed-limit-up-enabled": false,
"start-added-torrents": true,
"trash-original-torrent-files": false,
"umask": 18,
"upload-limit": 100,
"upload-limit-enabled": 0,
"upload-slots-per-torrent": 14
}

Всьо просто і ясно, тепер за адресою сервера і 9000 портом можна після авторизації зайти на симпатичний інтерфейсик торента.

Transmission

Ще й роздаються два торенти :) Головне, що нікуди не дінуться тепер.

Через деякий час знову стало пороблено, в тому сенсі, що оперативна пам’ять закінчувалась катастрофічними темпами

На жаль, список привести не можу, бо не виконувалась жодна команда, лише приблизно опишу витрати пам’яті кожним процесом.

mysql – 110M
apache – 70M
fail2ban – 70M
webmin – 15M
transmission – 23M
ssh – 10M
proftpd – 10M

Ну і решта дрібноти по пару мегабайт. Щоб щось зробити прибивав fail2ban, потім запускав знову. Коли з часом навантаження росло, всі процеси пухли так, що навіть не було як зупинити :)

Найважчий демон mysql, відключив в /etc/mysql/my.cnf обробники BerkeleyDB і InnoDB (), також, так як БД-сервер на тій же машині, що і веб-сервер, то немає потреби слухати TCP порт для віддаленого з’єдання.

skip-bdb
skip-innodb
skip-networking

Потім лишень

/etc/init.d/mysql restart

і маю замість 110 Мб лише 32! Круто, та випадково гугль відправив на сторінку хабра, де дізнався про особливості VPS, і одразу ж застосував пораду, дописав в /etc/init.d/rc рядок

ulimit -s 1024

Потім

shutdown -r now

Вуаля,

cs1281:~# free
total       used       free     shared    buffers     cached
Mem:        262144     120404     141740          0          0          0
-/+ buffers/cache:     120404     141740
Swap:            0          0          0
32383 	www-data 	69900 kB 	/usr/sbin/apache2 -k start
32746 	www-data 	67404 kB 	/usr/sbin/apache2 -k start
32738 	root 	63500 kB 	/usr/sbin/apache2 -k start
24333 	root 	14940 kB 	/usr/share/webmin/proc/index_size.cgi
32316 	debian-transmission 	14824 kB 	/usr/bin/transmission-daemon --config-dir /var/lib/transmission-daemon/info
7551 	root 	13260 kB 	/usr/bin/python /usr/bin/fail2ban-server -b -s /var/run/fail2ban/fail2ban.sock
32763 	root 	12944 kB 	/usr/bin/perl /usr/share/webmin/miniserv.pl /etc/webmin/miniserv.conf
32243 	mysql 	11680 kB 	/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file ...
3988 	root 	9944 kB 	sshd: root@pts/0
32362 	root 	8392 kB 	sendmail: MTA: accepting connections
16368 	root 	5552 kB 	mc
32186 	root 	5492 kB 	/usr/sbin/sshd
32685 	proftpd 	5436 kB 	proftpd: (accepting connections)
32301 	www-data 	5192 kB 	nginx: worker process
32302 	www-data 	4792 kB 	nginx: worker process
32300 	root 	4612 kB 	nginx: master process /usr/sbin/nginx
5987 	root 	2904 kB 	-bash
16370 	root 	2896 kB 	bash -rcfile .bashrc
24462 	root 	2740 kB 	sh -c ps --cols 2048 -eo user:80,ruser:80,group:80,rgroup:80,pid,ppid,pgid,pcpu, ...
32222 	root 	2544 kB 	/bin/sh /usr/bin/mysqld_safe
32365 	root 	2392 kB 	/usr/sbin/xinetd -pidfile /var/run/xinetd.pid -stayalive -inetd_compat -inetd_ip ...
24463 	root 	2348 kB 	ps --cols 2048 -eo user:80,ruser:80,group:80,rgroup:80,pid,ppid,pgid,pcpu,vsz,ni ...
32729 	root 	2288 kB 	/usr/sbin/cron
1 	root 	2028 kB 	init [2]
32095 	daemon 	1804 kB 	/sbin/portmap
32175 	root 	1736 kB 	/sbin/syslogd
32244 	root 	1668 kB 	logger -p daemon.err -t mysqld_safe -i -t mysqld

Таким чином, можна спокійно існувати далі.

This entry was posted in GNU\Linux, Розробка web. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

3 Comments

  1. Constantine
    Posted 15.07.2010 at 10:10 | Permalink

    Декілька порад:
    1. Перевісити ссш на порт, скажем 22222, тоді його не буде видно при скануванні, і додаткові пакетики (читай надлишкові ресурси) не потрібні. Хоча все ж таки з iptables корисно розібратися, тоді наприклад фтп можна відкрити лише для потрібних адрес.
    2. Замість transmission раджу rtorrent, він стабільніший, шустріший і більш функціональний. І вебморда внього красивіша.
    3. З мускулом можна ще більш потюнити конфіг, за основу взяти /usr/share/doc/mysql-server-5.1/examples/my-small.cnf

    Успіхів!

  2. Posted 15.07.2010 at 16:12 | Permalink

    1. Гм, треба буде якось зробити ссш, та відкритий порт буде видно, який би він не був. а пакетик fail2ban допомагає не лише ссш, а і багато інших фіч має. Та й ресурси ніби не дуже витрачає після допилювання, най жиє.
    2. Всі фломастери різні ) Зараз і так не тягну нічого торентокачалкою, лишив роздавати ці цяцьки з обмеженням 100 кб/с, наберу рейтинг, може приб’ю демона, нєфіг.
    3. mysql настроїв вже таким чином, виграш був десь 20 мб оперативки – тобто було 131, стало 111 (приблизно, звісно), хоча порада хороша.

    • Constantine
      Posted 16.07.2010 at 11:24 | Permalink

      По замовчуванню, nmap (а сканують як правило ним) сканує порти 1-10000, далі не лізуть, оскільки то довго і нецікаво, перевірено на собі. А все решта, як правило, не потрібно виставляти на зовні для всіх.

      Але в кожного свій шлях, так що все ок.

Post a Comment

You must be logged in to post a comment.