from:https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x02_DNFWAH_gnu-linux_security_baseline_hardening.txt
By Shawn
隨著GNU/Linux在各個行業的IT基礎架構中的普及,安全問題也成為了關注的焦點, GNU/Linux主要是由GNU核心組建( 編譯器GCC, C庫Glibc等)和Linux內核組合而成, 在自由開源軟件統治著基礎平臺的大環境下,不少人認為開源一定是安全的,這 是一種不完全正確的觀念,Coverity的報告只是說明了開源比閉源更安全,這并 不代表自由開源軟件就是牢不可破的,自由開源軟件在一定程度上具有一些安全 的特性,這些特性不一定在GNU/Linux發行版中是默認開啟,這些特性中有一些是 必須在安全基線中去部署的,有一些可以根據具體需求來定制,這篇文檔主要是 介紹一些關于安全基線建設和加固的基本內容。
在實際的安全咨詢工作中,很多普通個人用戶和企業用戶并不是安全領域的黑客, 大多客戶都會要求給出一份簡單易懂的部署文檔,也就是所謂的安全基線,基線 和加固是很大的話題,我會盡力不斷更新這篇文檔的內容,也希望有社區的朋友 參與,本文所使用的GNU/Linux發行版是Debian。
在遵循最小安裝和最小權限的部署原則下,還有一些地方是需要注意的,我們把 這些部分稱為安全基線。
1.1 安全修復更新
作為系統管理員,每天干的第1件事情就應該是查看生產環境的機器是否有安全修 復的更新,甚至應該除了生產環境再另外跑一套模擬環境,用于測試升級后是否 影響業務系統。
Debian檢查需要安全修復包:
sudo apt-get upgrade -s | grep -i security
OpenSuSE發行版檢查需要安全修復的包:
sudo zypper lp | awk '{ if ($7=="security"){ if ($11=="update") {print $13} else{ print $11 }}}' | sed 's/:$//' | grep -v "^$" | sort | uniq
1.2 密碼策略
root密碼策略至少應該考慮以下幾點:
1,密碼強度,至少是字母+數字一共9位以上
2,不同的系統密碼不能一樣
3,根換密碼策略(每90天更換一次)
4,密碼分發管理,管理不同業務服務器的系統管理員掌握不同的密碼
1.2.1 業務分離
生產環境中,不同的業務可以做水平分離,比如把不同的服務運行到不同的虛擬機 中,不需要遠程訪問的服務器可以綁定到 localhost( 比如只需要訪問本機業務的 mysql) 上。
1.3 SSH安全配置
openssh目前的默認配置文件相比以前雖然要安全的多,但還是有必要對生產系統 中的ssh服務器進行基線檢查。
/etc/ssh/ssh_config
1,known_hosts保存相關服務器的簽名,所以必須把主機名hash:
HashKnownHosts yes
2,SSH協議v1不安全:
Protocol 2
3,如果沒用X11轉發的情況:
X11Forwarding no
4,關閉rhosts:
IgnoreRhosts yes
5,關閉允許空密碼登錄:
PermitEmptyPasswords no
6,最多登錄嘗試次數:
MaxAuthTries 5
7,禁止root登錄
PermitRootLogin no
1,關閉密碼認證,啟用公鑰認證:
PubkeyAuthentication yes
PasswordAuthentication no
2,允許或者禁止用戶/組登錄:
1.4 auditd審計框架
auditd是接收內核審計模塊關于系統調用信息的一個用戶態程序,可以通過一些 規則來對一些系統調用或者文件目錄進行監控。
安裝auditd:
sudo apt-get install auditd
配置文件:/etc/audit/auditd.conf
存儲地址log_file = /var/log/audit/audit.log
/etc/audit/audit.rules
,這里給出一個例子:# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 320
-a always,exit -S adjtimex -S settimeofday -S stime -k time-change
-a always,exit -S clock_settime -k time-change
-a always,exit -S sethostname -S setdomainname -k system-locale
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k identity
-w /var/run/utmp -p wa -k session
-w /var/log/wtmp -p wa -k session
-w /var/log/btmp -p wa -k session
-w /etc/apparmor -p wa -k MAC-policy
-w /etc/apparmor.d -p wa -k MAC-policy
上面的例子對一系列關于時間的系統調用進行了監控,一旦時間出現改變就會記 錄進如日志,之后對幾個跟創建/刪除用戶和組的文件也進行了監控,最后是對 apparmor的配置文件和規則目錄進行監控。在/etc/apparmor下的shell中輸入:
sudo touch hello
用工具ausearch來進行查詢:
sudo ausearch -i -k MAC-policy
type=CONFIG_CHANGE msg=audit(07/20/2014 20:36:48.397:58) : auid=root ses=2 op="add rule" key=MAC-policy list=exit res=1
type=CONFIG_CHANGE msg=audit(07/20/2014 20:36:48.445:59) : auid=root ses=2 op="add rule" key=MAC-policy list=exit res=1
type=PATH msg=audit(07/20/2014 20:38:42.717:61) : item=1 name=hello inode=799889 dev=08:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=CREATE
type=PATH msg=audit(07/20/2014 20:38:42.717:61) : item=0 name=/etc/apparmor inode=783766 dev=08:01 mode=dir,755 ouid=root ogid=root rdev=00:00 nametype=PARENT
type=CWD msg=audit(07/20/2014 20:38:42.717:61) : cwd=/etc/apparmor
type=SYSCALL msg=audit(07/20/2014 20:38:42.717:61) : arch=i386 syscall=open success=yes exit=3 a0=bfeca8ab a1=8941 a2=1b6 a3=1 items=2 ppid=17704 pid=17876 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=2 comm=touch exe=/bin/touch key=MAC-policy
type=PATH msg=audit(07/20/2014 20:38:56.017:62) : item=1 name=hello inode=799889 dev=08:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=DELETE
type=PATH msg=audit(07/20/2014 20:38:56.017:62) : item=0 name=/etc/apparmor inode=783766 dev=08:01 mode=dir,755 ouid=root ogid=root rdev=00:00 nametype=PARENT
type=CWD msg=audit(07/20/2014 20:38:56.017:62) : cwd=/etc/apparmor
type=SYSCALL msg=audit(07/20/2014 20:38:56.017:62) : arch=i386 syscall=unlinkat success=yes exit=0 a0=ffffff9c a1=89eb8c0 a2=0 a3=0 items=2 ppid=17704 pid=17889 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=2 comm=rm exe=/bin/rm key=MAC-policy
也可以使用aureport來生成報告。
1.4.1 針對文件的審計
find / -path /proc -prune -name "-*"
find / -path /proc -prune -o -perm -2 ! -type l -ls
3, 一個沒有owner的文件是存在潛在威脅的,因為你永遠也不知道未來某個時候她的
find / -path /proc -prune -o -nouser -o -nogroup
egrep -v '.*:\*|:\!' /etc/shadow | awk -F: '{print $1}'
5, 你要刪除一個用戶前,應該先了解一些有哪些文件是他擁有的: ---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||--x
find / -path /proc -prune -o -user account -ls
然后,安全的刪除:
userdel -r account
grep -v ':x:' /etc/passwd
ls -l /boot
(可選)
1, GNU/Linux的訪問控制列表(ACL)也是不錯的文件權限管理的途徑,獲得文件
getfacl file
設置哪些用戶對哪些文件有什么樣的權限:
net.ipv4.tcp_syncookies = 1
/proc/sys/net/ipv4/tcp_syncookies
(可選),如果需要開啟SYNPROXY可以直接:
iptables -t raw -A PREROUTING -i eth0 -p tcp --dport 80 --syn -j NOTRACK
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state UNTRACKED,INVALID \
-j SYNPROXY --sack-perm --timestamp --mss 1480 --wscale 7 --ecn
echo 0 > /proc/sys/net/netfilter/nf_conntrack_tcp_loose
源路由通常可以用于在IP包的OPTION里設置途經的部分或者全部路由器,這個 特性可以用于網絡排錯和優化,比如traceroute,攻擊者也可以使用這個特性來
net.ipv4.conf.all.accept_source_route = 0
/proc/sys/net/ipv4/conf/all/accept_source_route
ICMP重定向,正常用于選擇最優路徑,攻擊者可以利用開展中間人攻擊,關閉設
net.ipv4.conf.all.accept_redirects = 0
/proc/sys/net/ipv4/conf/all/accept_redirects
net.ipv4.conf.all.rp_filter = 1
/proc/sys/net/ipv4/conf/all/rp_filter
net.ipv4.icmp_echo_ignore_all = 1
/proc/sys/net/ipv4/icmp_echo_ignore_all
net.ipv4.icmp_echo_ignore_broadcasts = 1
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
net.ipv4.icmp_ignore_bogus_error_responses = 1
/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
/proc/sys/net/ipv4/conf/all/log_martians
net.ipv4.conf.all.log_martians = 1
kernel.randomize_va_space=2
/proc/sys/kernel/randomize_va_space
kernel.kptr_restrict=1
/proc/sys/kernel/kptr_restrict
vm/mmap_min_addr=65536
/proc/sys/vm/mmap_min_addr
Apparmor
安裝Apparmor和社區規則:
sudo apt-get install -y apparmor-profiles apparmor
查看狀態是否運行正常:
sudo aa-status
安全基線是在防御已知的威脅,而加固則是側重于防御未知的威脅,加固的主要 目的是增加攻擊者的成本。
3.1 內核加固 - Grsecurity/PaX
GNU/Linux平臺從用戶空間到內核空間都有一系列的加固措施,但是,對于真正面 臨復雜安全環境,確實需要高級安全防護能力的機構,最極端的加固防御是: Grsecurity/PaX,對于注重完美的“老派( old school )”黑客社區而言,沒有 Grsecurity/PaX 的定制方案是不完美的 ,這里摘選幾段old school社區的調侃:
"The "better than none" point of view is actually a nice way to false sense of security for those who don't know better. We got better-than-none apparmor, selinux, tomoyo, some poorly maintained and crippled ports of grsec features or alikes, namespaces and containers, rootkit-friendly LSM, the dumb and useless kernel version of SSP, etc. What's the sum of all this shit for end users? False sense of security..."
"without Grsecurity/PaX, linux security is like monkey can never perform a regular masturbation cu'z lacking of giant pennis;-)"
作為個人完全贊同以上觀點,太多的better-than-none可以算是"甜點",用戶使 用后會覺得自high的很爽,但是到了夜幕降臨的時候,用戶還是很難入睡,因為 "痛點"依然在那里,在安全領域,"甜點"就是"安全感",安全感絕對不等同于安 全。
Anyway,對于商業客戶而言,是否對Grsecurity/PaX定制是一種選擇。
https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.1.tar.xz
下載Grsecurity/PaX補丁: https://github.com/citypw/citypw-SCFE/raw/master/security/apparmor_test/grsecurity-3.0-3.14.11-201407072045.patch
解壓內核然后打補丁:
Patch the kernel with grsecurity:
xz -d linux-3.14.1.tar.xz
tar xvf linux-3.14.1.tar
cd linux-3.14.1/
patch -p1 < ../grsecurity-3.0-3.14.3-201405121814.patch
你可以在"make menuconfig"里自己定制符合你口味的內核,也可以使用我測試用 的內核config文件: https://raw.githubusercontent.com/citypw/citypw-SCFE/master/security/apparmor_test/debian-7.4-linux-3.14.1-grsec.config
編譯內核(-jx, x通常==你的CPU核數+1):
make -j7 deb-pkg
安裝編譯后的內核:
dpkg -i ../*.deb
現在內核的部分結束,關于RBAC規則可以使用用戶態工具gradm的Learning Mode 來實現,但不在本文的討論范疇。
3.2 PHP加固
1, PHP是常用的WEB開發語言,在WEB生產環境部署的過程中,目錄和文件的權限是需 要關注的,通常除了少數用途的目錄(比如上傳)外,都應該把寫入權限禁用:
find -type f -name \*.php -exec chmod 444 {} \;
find -type d -exec chmod 555 {} \;
2, 開啟 php 的安全模式,禁用 php 不安全的函數等加固,修改 php 配置文件 /etc/php5/apache2/php.ini :
// 設置模式為安全模式,此值直接影響 disable_functions 的命令是否生效; [SQL]
; http://php.net/sql.safe-mode
sql.safe_mode = On
// 禁用不安全的函數
disable_functions = system, show_source, symlink, exec, dl, shell_exec,
passthru, phpinfo, escapeshellarg, escapeshellcmd
// 避免暴露 php 信息
expose_php = Off
// 關閉錯誤信息提示
display_errors = Off
// 不允許調用 dl
enable_dl = Off
// 避免遠程調用文件
allow_url_include = Off
0x04 Reference
[1] 開源閉源項目代碼質量對比 http://www.solidot.org/story?sid=39173
[2] Back To The Future: Unix Wildcards Gone Wild http://www.defensecode.com/public/DefenseCode_Unix_WildCards_Gone_Wild.txt
[3] SYNPROXY:廉價的抗DoS攻擊方案 www.solidot.org/story?sid=38791
[4] INTERNET PROTOCOL http://tools.ietf.org/html/rfc791
[5] A simple TCP spoofing attack http://www.citi.umich.edu/u/provos/papers/secnet-spoof.txt
[6] ICMP Attacks Illustrated http://www.sans.org/reading-room/whitepapers/threats/icmp-attacks-illustrated-477
[7] SUSE Linux Enterprise Server 11 SP3 - Security and Hardening https://www.suse.com/documentation/sles11/singlehtml/book_hardening/book_hardening.html
[8] Securing Debian Manual https://www.debian.org/doc/manuals/securing-debian-howto/
[9] A Brief Introduction to auditd http://security.blogoverflow.com/2013/01/a-brief-introduction-to-auditd/
[10] Apparmor RBAC http://wiki.apparmor.net/index.php/Pam_apparmor_example
[11] Hardening PHP from php.ini http://www.madirish.net/199
[12] CVE-2014-0196 exploit http://bugfuzz.com/stuff/cve-2014-0196-md.c