Linux系統安全需要注意的一些問題,linux系統安全

來源:互聯網
上載者:User

Linux系統安全需要注意的一些問題,linux系統安全

寫在前面:當你部署一台伺服器,第一步不應該是部署應用,安全是才是首要任務

如果某一天當你登入伺服器發現 /bin/bash –i,python -c 'import pty; pty.spawn("/bin/sh")' 等命令在伺服器上出現的時候,那麼恭喜你,伺服器被入侵了

但是入侵者都是很聰明的,首先會執行以下命令

unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0

然後是通過跳板訪問

ssh -o UserKnownHostsFile=/dev/null -T user@host /bin/bash –i

建立ttyshell

python -c ‘import pty; pty.spawn(“/bin/sh”)’

然後清除訪問記錄

shred -n 31337 -z -u file_to_delete

等等。。。一系列的操作

然後你就能看到伺服器上會留下以上的蛛絲馬跡,那麼我們如何防止呢?

1、系統使用者最佳化 

使用者是Linux中安全強化的第一關,如果系統中本身就存在有安全隱患的使用者,那麼再安全性原則也無法起到加固的效果 

cat /etc/passwd | awk -F: '$3==0'  //列出具有超級許可權的使用者cat /etc/passwd | grep '/bin/bash'  //列出具有登入shell的使用者

如果除了root還有其他的超級使用者,那就要非常小心了

1.1 將系統內建的使用者和使用者組刪除掉

刪除的使用者,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher

刪除的組,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers

1.2 或者鎖定不需要登入的使用者

如: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

1.3 限制能夠su為root的使用者
#在 /etc/pam.d/su 頭部添加:auth required /lib/security/pam_wheel.so group=wheel

這樣,只有wheel組的使用者可以su到root

1.4 檢查shadow中空口令帳號
awk -F: '( $2== "") { print }' /etc/shadow

對空口令帳號進行鎖定,或要求增加密碼

1.5 系統關鍵目錄許可權控制

根據安全需要,配置某些關鍵目錄其所需的最小許可權,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
2、系統服務最佳化  

一般情況下,系統可能會自動的運行一些不必要的服務,我們可以使用下面的命令查看當前預設開啟啟動並執行系統服務: 

chkconfig --list | grep "3:on"

如果我們只是提供web服務,那麼對於sendmail、nfs、postfix、ftp等不需要的服務就可以關閉了

對於關鍵的服務,我們需要保證它們的運行,比如:iptables、sshd、syslog、httpd、nginx、mysql、php-fpm等。 

3、ssh存取原則  

ssh的訪問都是我們日常工作中幾乎唯一的控制系統的手段。所以ssh的安全性非常重要,一般來說較高的ssh安全性原則秉承以下幾個原則。 

  • 禁止root使用者ssh登入。

  • 禁止口令的方式驗證。

  • 只允許一個使用者擁有sudo的完整許可權。

  • 除非是Bastion Host,系統中不允許存放私密金鑰檔案。

  • 使用一個隨機連接埠來代替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連接埠

4、系統內部安全配置4.1、保護引導過程
//使用者啟動需要輸入主機密碼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
4.2、核心修改

/etc/sysctl.conf 改為以下內容

kernel.shmall = 268435456net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 1200net.ipv4.ip_local_port_range = 1024 65000net.ipv4.tcp_max_tw_buckets = 5000net.ipv4.tcp_max_tw_buckets = 5000net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 300net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.ip_local_port_range = 5000 65000net.ipv4.tcp_mem = 786432 1048576 1572864net.core.wmem_max = 873200net.core.rmem_max = 873200net.ipv4.tcp_wmem = 8192 436600 873200net.ipv4.tcp_rmem = 32768 436600 873200net.core.somaxconn = 256net.core.netdev_max_backlog = 1000net.ipv4.tcp_max_syn_backlog = 2048net.ipv4.tcp_retries2 = 5net.ipv4.tcp_keepalive_time = 500net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3net.ipv4.conf.lo.arp_ignore = 0net.ipv4.conf.lo.arp_announce = 0net.ipv4.conf.all.arp_ignore = 0net.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通訊端拖死
4.3 密碼口令策略修改
cat /etc/login.defs|grep PASSPASS_MAX_DAYS 90 #建立使用者的密碼最長使用天數PASS_MIN_DAYS 0 #建立使用者的密碼最短使用天數PASS_WARN_AGE 7 #建立使用者的密碼到期提前提醒天數PASS_MIN_LEN 9 #最小密碼長度9
4.4 曆史命令保留和常用服務連接埠修改
vim /etc/profile修改HISTSIZE=5和HISTFILESIZE=5即保留最新執行的5條命令常用服務入SSH,FTP,MYSQL,等,不要使用預設連接埠
4.5、Banner偽裝

可以擾亂入侵者這對伺服器資訊的判斷

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_forwardiptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to xx.xx.xx.xxiptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE
4.6、防火牆IPtables設定

下面是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 ACCEPTCOMMIT# Completed on Thu Oct 31 19:38:46 2013service iptables saveservice iptables restart

(1) iptables 防止CC攻擊的規則

安裝 kernel-smp-modules-connlimit 、recent 核心模組

modprobe ipt_connlimit
如果沒有這個檔案需要建立如下檔案

# cat /etc/modprobe.d/ipt.confoptions ipt_recent ip_pkt_list_tot=200modprobe –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 REJECTiptables -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
4.7、防止暴力登入

ftp,ssh暴力登入,指令碼實現。

4.8、監控所有終端使用者操作

記錄所有登入使用者終端操作命令記錄

vim /etc/profilePS1="`whoami`@`hostname`:"'[$PWD]'historyUSER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]then   USER_IP=`hostname`fiif [ ! -d /tmp/csi ]then   mkdir /tmp/csi   chmod 777 /tmp/csifiif [ ! -d /tmp/csi/${LOGNAME} ]then    mkdir /tmp/csi/${LOGNAME}    chmod 300 /tmp/csi/${LOGNAME}fiexport HISTSIZE=4096DT=`date "+%Y-%m-%d_%H:%M:%S"`export HISTFILE="/tmp/csi/${LOGNAME}/${USER_IP} csi.$DT"chmod 600 /tmp/csi/${LOGNAME}/*csi* 2>/dev/nullsource /etc/profile
4.9 日誌審計

統一遠程Log Service器配置,當前系統應配置遠程日誌功能,將需要重點關注的日誌內容傳輸到Log Service器進行備份。

修改設定檔 /etc/rsyslog.conf

加上這一行:authpriv.* @x.x.x.x

重新啟動syslog服務,執行下列命令:services syslogd restart

4.10、更改危險檔案(命令)許可權

只有root使用者能使用一下命令

chmod 700 /bin/pingchmod 700 /usr/bin/fingerchmod 700 /usr/bin/whochmod 700 /usr/bin/wchmod 700 /usr/bin/locatechmod 700 /usr/bin/whereischmod 700 /sbin/ifconfigchmod 700 /usr/bin/picochmod 700 /usr/bin/vichmod 700 /usr/bin/whichchmod 700 /usr/bin/gccchmod 700 /usr/bin/makechmod 700 /bin/rpm
4.11、殺毒軟體

下載 http://www.clamav.net/lang/en/download/sources/

直接下載:http://downloads.sourceforge.net/clamav/clamav-0.98.1.tar.gz

4.12 、rootkit病毒檢測

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

4.13、inotify 監控系統檔案

監控命令

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

5、系統應用安全配置 5.1、中介軟體 安全配置

(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;   }}
5.2、php 安全配置
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,dirmagic_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/wwwdisplay_errors = Offerror_reporting = E_WARNING & E_ERRORlog_errors = Onerror_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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.