寫在前面:當你部署一臺服務器,第一步不該該是部署應用,安全是纔是首要任務php
若是某一天當你登陸服務器發現 /bin/bash –i,python -c 'import pty; pty.spawn("/bin/sh")' 等命令在服務器上出現的時候,那麼恭喜你,服務器被入侵了html
可是入侵者都是很聰明的,首先會執行如下命令python
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0
而後是經過跳板訪問mysql
ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i
創建ttyshelllinux
python -c ‘import pty; pty.spawn(「/bin/sh」)’
而後清除訪問記錄nginx
shred -n 31337 -z -u file_to_delete
等等。。。一系列的操做web
而後你就能看到服務器上會留下以上的蛛絲馬跡,那麼咱們如何防止呢?sql
用戶是Linux中安全加固的第一關,若是系統中自己就存在有安全隱患的用戶,那麼再安全策略也沒法起到加固的效果 shell
cat /etc/passwd | awk -F: '$3==0' //列出具備超級權限的用戶 cat /etc/passwd | grep '/bin/bash' //列出具備登陸shell的用戶
若是除了root還有其餘的超級用戶,那就要很是當心了
apache
刪除的用戶,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher
刪除的組,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers
如:xfs,news,nscd,dbus,vcsa,games,nobody,avahi,haldaemon,gopher,ftp,mailnull,pcap,mail,shutdown,halt,uucp,operator,sync,adm,lp,bin,sys,nuucp,hpdb,www,daemon
#在 /etc/pam.d/su 頭部添加: auth required /lib/security/pam_wheel.so group=wheel
這樣,只有wheel組的用戶能夠su到root
awk -F: '( $2== "") { print }' /etc/shadow
對空口令帳號進行鎖定,或要求增長密碼
根據安全須要,配置某些關鍵目錄其所需的最小權限,password文件、shadow文件、group文件權限。
/etc/passwd 全部用戶均可讀,root用戶可寫 –rw-r—r—
chmod 644 /etc/passwd
/etc/shadow 只有root可讀 –r——–
chmod 600 /etc/shadow
/etc/group 必須全部用戶均可讀,root用戶可寫 –rw-r—r—
chmod 644 /etc/group
通常狀況下,系統可能會自動的運行一些沒必要要的服務,咱們可使用下面的命令查看當前默認開啓運行的系統服務:
chkconfig --list | grep "3:on"
若是咱們只是提供web服務,那麼對於sendmail、nfs、postfix、ftp等不須要的服務就能夠關閉了
對於關鍵的服務,咱們須要保證它們的運行,好比:iptables、sshd、syslog、httpd、nginx、mysql、php-fpm等。
ssh的訪問都是咱們平常工做中幾乎惟一的控制系統的手段。因此ssh的安全性很是重要,通常來講較高的ssh安全策略秉承如下幾個原則。
禁止root用戶ssh登陸。
禁止口令的方式驗證。
只容許一個用戶擁有sudo的完整權限。
除非是堡壘機,系統中不容許存放私鑰文件。
使用一個隨機端口來代替22端口。
編輯 /etc/sudoers,加入一條:
test ALL=(ALL) NOPASSWD: ALL
這裏的例子表示:將test賦予徹底的sudo權限,並在sudo提權時不須要驗證密碼。
sed -i 's/\(PasswordAuthentication\) yes/\1 no/' /etc/ssh/sshd_config //禁止口令,使用證書 sed -i 's/\(PermitRootLogin\) yes/\1 no/' /etc/ssh/sshd_config //禁止root用戶ssh登陸
如今咱們來看ssh的訪問效果:
全部用戶不能使用密碼驗證登陸。
root用戶不可直接登陸的,即便擁有root密碼,惟一得到root的方法是使用test用戶提權。
test用戶只可使用證書登陸。
ssh再也不使用默認的22端口
//用戶啓動須要輸入主機密碼 echo "sp:S:respawn:/sbin/sulogin" >> /etc/inittab //編輯/etc/init/control-alt-delete.conf,禁用 ctrlaltdel start on control-alt-delete 更改成 #start on control-alt-delete
/etc/sysctl.conf 改成如下內容
kernel.shmall = 268435456 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 5000 65000 net.ipv4.tcp_mem = 786432 1048576 1572864 net.core.wmem_max = 873200 net.core.rmem_max = 873200 net.ipv4.tcp_wmem = 8192 436600 873200 net.ipv4.tcp_rmem = 32768 436600 873200 net.core.somaxconn = 256 net.core.netdev_max_backlog = 1000 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_retries2 = 5 net.ipv4.tcp_keepalive_time = 500 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.conf.lo.arp_ignore = 0 net.ipv4.conf.lo.arp_announce = 0 net.ipv4.conf.all.arp_ignore = 0 net.ipv4.conf.all.arp_announce = 0
/etc/security/limits.conf 改成如下內容
* soft nofile 655360 * hard nofile 655360
解釋
net.ipv4.tcp_syncookies = 1 #表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉; net.ipv4.tcp_tw_reuse = 1 #表示開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0,表示關閉; net.ipv4.tcp_tw_recycle = 1 #表示開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。 net.ipv4.tcp_fin_timeout = 30 #表示若是套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。 net.ipv4.tcp_keepalive_time = 1200 #表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改成20分鐘。 net.ipv4.ip_local_port_range = 1024 65000 #表示用於向外鏈接的端口範圍。缺省狀況下很小:32768到61000,改成1024到65000。 net.ipv4.tcp_max_tw_buckets = 5000 #表示系統同時保持TIME_WAIT套接字的最大數量,若是超過這個數字, #TIME_WAIT套接字將馬上被清除並打印警告信息。默認爲180000,改成5000。 #對於Apache、Nginx等服務器,上幾行的參數能夠很好地減小TIME_WAIT套接字數量, #可是對於Squid,效果卻不大。此項參數能夠控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死
cat /etc/login.defs|grep PASS PASS_MAX_DAYS 90 #新建用戶的密碼最長使用天數 PASS_MIN_DAYS 0 #新建用戶的密碼最短使用天數 PASS_WARN_AGE 7 #新建用戶的密碼到期提早提醒天數 PASS_MIN_LEN 9 #最小密碼長度9
vim /etc/profile 修改HISTSIZE=5和HISTFILESIZE=5即保留最新執行的5條命令 經常使用服務入SSH,FTP,MYSQL,等,不要使用默認端口
能夠擾亂入侵者這對服務器信息的判斷
a、Vsftpd banner 假裝
修改vsftpd.conf
ftpd_banner=Welcome to Microsoft FTP service.
b、Apache banner 假裝
修改/usr/local/apache/conf/httpd.conf文件,能夠隱藏一些apache信息,若是要屏蔽掉全部信息,須要修改源碼文件從新編譯
httpd-2.2.25/include/ap_release.h
httpd-2.2.25/os/unix/os.h
c、Nginx banner 假裝
在nginx.conf 的 http 塊裏面添加 server_tokens off;
若要完全屏蔽,須要修改源碼,從新安裝
src/core/nginx.h
d、 PHP banner修改
php.ini 修改expose_php On —> expose_php = Off
Php彩蛋,PHP源碼/ext/standard/info.h
e、 TTL值修改
echo net.ipv4.ip_default_ttl = 128 >> /etc/sysctl.conf
/sbin/sysctl –p
f、利用iptables,將本機的TCP 3389端口轉移到其它開有3389端口的計算機上,給Linux系統假裝出一個提供服務的TCP 3389端口
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to xx.xx.xx.xx iptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE
下面是linux一些經常使用的服務所須要的規則。(根據實際狀況更改)
vim /etc/sysconfig/iptables # Generated by iptables-save v1.3.5 on Thu Oct 31 19:38:46 2013 *filter :INPUT ACCEPT [782:100478] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [227493:21979253] -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT -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 (能夠用後面的防CC的規則替代) -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT -A INPUT –p tcp -j REJECT –reject-with tcp-reset -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 Oct 31 19:38:46 2013 service iptables save service iptables restart
(1) iptables 防止CC攻擊的規則
安裝 kernel-smp-modules-connlimit 、recent 內核模塊
modprobe ipt_connlimit
若是沒有這個文件須要新建以下文件
# cat /etc/modprobe.d/ipt.conf options ipt_recent ip_pkt_list_tot=200 modprobe –r ipt_recent
控制單個IP的最大併發鏈接數
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT #容許單個IP的最大鏈接數爲 30 //控制單個IP在必定的時間(好比60秒)內容許新創建的鏈接數 iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT #單個IP在60秒內只容許最多新建30個鏈接
(2)iptables 限制主機登陸的規則
//限制每一個主機每小時只能鏈接5次主機(INPUT鏈默認規則爲ACCEPT) iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
ftp,ssh暴力登陸,腳本實現。
記錄全部登陸用戶終端操做命令記錄
vim /etc/profile PS1="`whoami`@`hostname`:"'[$PWD]' history USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` if [ "$USER_IP" = "" ] then USER_IP=`hostname` fi if [ ! -d /tmp/csi ] then mkdir /tmp/csi chmod 777 /tmp/csi fi if [ ! -d /tmp/csi/${LOGNAME} ] then mkdir /tmp/csi/${LOGNAME} chmod 300 /tmp/csi/${LOGNAME} fi export HISTSIZE=4096 DT=`date "+%Y-%m-%d_%H:%M:%S"` export HISTFILE="/tmp/csi/${LOGNAME}/${USER_IP} csi.$DT" chmod 600 /tmp/csi/${LOGNAME}/*csi* 2>/dev/null source /etc/profile
統一遠程日誌服務器配置,當前系統應配置遠程日誌功能,將須要重點關注的日誌內容傳輸到日誌服務器進行備份。
修改配置文件 /etc/rsyslog.conf
加上這一行:authpriv.* @x.x.x.x
從新啓動syslog服務,執行下列命令:services syslogd restart
只有root用戶能使用一下命令
chmod 700 /bin/ping chmod 700 /usr/bin/finger chmod 700 /usr/bin/who chmod 700 /usr/bin/w chmod 700 /usr/bin/locate chmod 700 /usr/bin/whereis chmod 700 /sbin/ifconfig chmod 700 /usr/bin/pico chmod 700 /usr/bin/vi chmod 700 /usr/bin/which chmod 700 /usr/bin/gcc chmod 700 /usr/bin/make chmod 700 /bin/rpm
下載 http://www.clamav.net/lang/en/download/sources/
直接下載:http://downloads.sourceforge.net/clamav/clamav-0.98.1.tar.gz
Rkhunter 下載:http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.2/rkhunter-1.4.2.tar.gz
chkrootkit 下載:ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
監控命令
inotifywait -m -d -o /tmp/inotify.log -r --timefmt "%F %T" --format '%T %w%f%:e' -e close_write,create, modify,attrib /var/www/html
Inotify監控比較大的目錄的時候會報錯,須要修改/proc/sys/fs/inotify/max_user_watches的值
建議寫入sysctl.conf:fs.inotify.max_user_watches=8192000
(1) apache安全配置
//Apache 禁止數據目錄執行php等腳本文件 <Directory "/path/directory"> <FilesMatch ".(php|asp|jsp)$"> Deny from all </FilesMatch> </Directory> //Apache禁用目錄瀏覽和符號連接追蹤 <Directory "/usr/local/apache/htdocs"> Options Indexes FollowSymLinks #禁用這兩項 AllowOverrride None Order allow,deny Allow from all </Directory>
(2) nginx安全配置
//Nginx 禁止數據目錄執行php等腳本文件(在nginx.conf server段配置) //單個目錄 location ~* ^ /attachments/.*\.(php|php5)$ { deny all; } //多個目錄 location ~* ^/(image|upload)/.*\.(php|php5)$ { deny all; } //nginx 的限制鏈接模塊limit_zone與limit_req_zone //limit_zone配置 http{ limit_conn_zone $binary_remote_addr zone=one:10m; #one是zone的名字,10m是會話狀態存儲空間 server{ limit_zone one 1; #1每秒限制連接1次 } } //Limit_req_zone配置 http{ limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; # rate=1r/s 的意思是每一個地址每秒只能請求一次,也就是說根據漏桶原理burst=120 一共有120塊令牌,而且每秒鐘只新增1塊令牌120塊令牌發完後 多出來的那些請求就會返回503 server{ limit_req zone=req_one burst=120; } }
open_basedir = .:/tmp/ #防止php木馬跨站,重要!! disable_funcation=chdir,dir,get_cwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file, file_get_contents,fputs,fwrite,chmod,phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open, proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server, escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space, posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,osix_getgrgid, posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid, posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill, posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times, posix_ttyname,posix_uname //若是服務器用到了採集,須要啓用unlink和fopen, file_get_contents,fputs,fwrite,dir //後臺上傳圖片用到的函數 mkdir,file,file_get_contents,fputs,fwrite,dir magic_quotes_gpc = Off //打開magic_quotes_gpc來防止SQL注入 magic_quotes_gpc = On //若是它打開後將自動把用戶提交對sql的查詢進行轉換,好比把 ' 轉爲 \'等,這對防止sql注射有重大做用。因此咱們推薦設置爲: register_globals = Off //關閉註冊全局變量 safe_mode = on //php的安全模式是個很是重要的內嵌的安全機制,可以控制一些php中的函數,好比system(),同時把不少文件操做函數進行了權限控制,也不容許對某些關鍵文件的文件,好比/etc/passwd,可是默認的php.ini是沒有打開安全模式的,咱們把它打開: safe_mode_gid = off //用戶組安全,當safe_mode打開時,safe_mode_gid被關閉,那麼php腳本可以對文件進行訪問,並且相同組的用戶也可以對文件進行訪問。 safe_mode_exec_dir = /usr/www display_errors = Off error_reporting = E_WARNING & E_ERROR log_errors = On error_log = D:/usr/local/apache2/logs/php_error.log //注意:給文件必須容許apache用戶的和組具備寫的權限
http://m.jb51.net/hack/55784.html
https://blog.slogra.com/post-684.html
http://blog.chinaunix.net/uid-25723371-id-4542221.html