Поки тішусь працюючим сервачком, натикнувся на звичні рутинні нюанси, які супроводжують діяльність подібних вузлів інтернету. В цьому пості мова піде про протидію брутфорсу 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 портом можна після авторизації зайти на симпатичний інтерфейсик торента.
Ще й роздаються два торенти Головне, що нікуди не дінуться тепер.
Через деякий час знову стало пороблено, в тому сенсі, що оперативна пам’ять закінчувалась катастрофічними темпами
На жаль, список привести не можу, бо не виконувалась жодна команда, лише приблизно опишу витрати пам’яті кожним процесом.
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 |
Таким чином, можна спокійно існувати далі.
3 Comments
Декілька порад:
1. Перевісити ссш на порт, скажем 22222, тоді його не буде видно при скануванні, і додаткові пакетики (читай надлишкові ресурси) не потрібні. Хоча все ж таки з iptables корисно розібратися, тоді наприклад фтп можна відкрити лише для потрібних адрес.
2. Замість transmission раджу rtorrent, він стабільніший, шустріший і більш функціональний. І вебморда внього красивіша.
3. З мускулом можна ще більш потюнити конфіг, за основу взяти /usr/share/doc/mysql-server-5.1/examples/my-small.cnf
Успіхів!
1. Гм, треба буде якось зробити ссш, та відкритий порт буде видно, який би він не був. а пакетик fail2ban допомагає не лише ссш, а і багато інших фіч має. Та й ресурси ніби не дуже витрачає після допилювання, най жиє.
2. Всі фломастери різні ) Зараз і так не тягну нічого торентокачалкою, лишив роздавати ці цяцьки з обмеженням 100 кб/с, наберу рейтинг, може приб’ю демона, нєфіг.
3. mysql настроїв вже таким чином, виграш був десь 20 мб оперативки – тобто було 131, стало 111 (приблизно, звісно), хоча порада хороша.
По замовчуванню, nmap (а сканують як правило ним) сканує порти 1-10000, далі не лізуть, оскільки то довго і нецікаво, перевірено на собі. А все решта, як правило, не потрібно виставляти на зовні для всіх.
Але в кожного свій шлях, так що все ок.