GNU/Linux安全基線與加固-0.1
from:https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x02_DNFWAH_gnu-linux_security_baseline_hardening.txt
By Shawn
0x00 關於這份文件
隨著GNU/Linux在各個行業的IT基礎架構中的普及,安全問題也成為了關注的焦點, GNU/Linux主要是由GNU核心組建( 編譯器GCC, C庫Glibc等)和Linux核心組合而成, 在自由開源軟體統治著基礎平臺的大環境下,不少人認為開源一定是安全的,這 是一種不完全正確的觀念,Coverity的報告只是說明了開源比閉源更安全,這並 不代表自由開源軟體就是牢不可破的,自由開源軟體在一定程度上具有一些安全 的特性,這些特性不一定在GNU/Linux發行版中是預設開啟,這些特性中有一些是 必須在安全基線中去部署的,有一些可以根據具體需求來定製,這篇文件主要是 介紹一些關於安全基線建設和加固的基本內容。
在實際的安全諮詢工作中,很多普通個人使用者和企業使用者並不是安全領域的駭客, 大多客戶都會要求給出一份簡單易懂的部署文件,也就是所謂的安全基線,基線 和加固是很大的話題,我會盡力不斷更新這篇文件的內容,也希望有社群的朋友 參與,本文所使用的GNU/Linux發行版是Debian。
0x01 安全基線
在遵循最小安裝和最小許可權的部署原則下,還有一些地方是需要注意的,我們把 這些部分稱為安全基線。
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,允許或者禁止使用者/組登入:
AllowGroups, AllowUsers, DenyUsers, DenyGroups
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 針對檔案的審計
1, Leo Juranic的詳細的分析[]了異常的萬用字元威脅有多大,:
find / -path /proc -prune -name "-*"
2, 所謂的world-writable許可權的檔案是不太合理的,所以這種檔案我們必須得提防:
find / -path /proc -prune -o -perm -2 ! -type l -ls
3, 一個沒有owner的檔案是存在潛在威脅的,因為你永遠也不知道未來某個時候她的
uid/gid成為了你的敵人:
find / -path /proc -prune -o -nouser -o -nogroup
4, 作為"自主可控"的自由軟體使用者,你得知道你的生產環境中哪些使用者是可用的:
egrep -v '.*:\*|:\!' /etc/shadow | awk -F: '{print $1}'
5, 你要刪除一個使用者前,應該先了解一些有哪些檔案是他擁有的: ---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||---||||--x
find / -path /proc -prune -o -user account -ls
然後,安全的刪除:
userdel -r account
6, 如果不帶':x:'的使用者肯定是無法正常使用的:
grep -v ':x:' /etc/passwd
7, /boot目錄許可權下至少是644,甚至是600:
ls -l /boot
(可選)
1, GNU/Linux的訪問控制列表(ACL)也是不錯的檔案許可權管理的途徑,獲得檔案
ACL的資訊:
getfacl file
設定哪些使用者對哪些檔案有什麼樣的許可權:
setfacl -m u:user:r file
0x02 核心安全基線
SYN cookies防護主要是為了防止SYN洪水攻擊,開啟設定為1:
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
注意:SYNPROXY是在3.13里加入的NETFILTER特性。
源路由通常可以用於在IP包的OPTION裡設定途經的部分或者全部路由器,這個 特性可以用於網路排錯和最佳化,比如traceroute,攻擊者也可以使用這個特性來
進行IP欺騙,關閉設定為0:
net.ipv4.conf.all.accept_source_route = 0
/proc/sys/net/ipv4/conf/all/accept_source_route
ICMP重定向,正常用於選擇最優路徑,攻擊者可以利用開展中間人攻擊,關閉設
置為0:
net.ipv4.conf.all.accept_redirects = 0
/proc/sys/net/ipv4/conf/all/accept_redirects
IP欺騙防護,啟動設定為1:
net.ipv4.conf.all.rp_filter = 1
/proc/sys/net/ipv4/conf/all/rp_filter
忽略ICMP請求( PING),啟動設定為1:
net.ipv4.icmp_echo_ignore_all = 1
/proc/sys/net/ipv4/icmp_echo_ignore_all
忽略ICMP廣播請求,啟動設定為1:
net.ipv4.icmp_echo_ignore_broadcasts = 1
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
錯誤訊息防護,會警告你關於網路中的ICMP異常,啟動設定為1:
net.ipv4.icmp_ignore_bogus_error_responses = 1
/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
對特定packet(IP欺騙,源路由,重定向)進行審計,啟動設定為1:
/proc/sys/net/ipv4/conf/all/log_martians
net.ipv4.conf.all.log_martians = 1
地址隨機化,啟動設定為2:
kernel.randomize_va_space=2
/proc/sys/kernel/randomize_va_space
核心符號限制訪問,啟動設定為1:
kernel.kptr_restrict=1
/proc/sys/kernel/kptr_restrict
類似CVE-2014-0196的exploit對於這一項就很難做到“通殺”;-)
記憶體對映最小地址,啟動設定為65536:
vm/mmap_min_addr=65536
/proc/sys/vm/mmap_min_addr
Apparmor
安裝Apparmor和社群規則:
sudo apt-get install -y apparmor-profiles apparmor
檢視狀態是否執行正常:
sudo aa-status
0x03 加固
安全基線是在防禦已知的威脅,而加固則是側重於防禦未知的威脅,加固的主要 目的是增加攻擊者的成本。
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定製是一種選擇。
安裝新的帶Grsecurity/PaX補丁的核心,以3.14.1為例,先下載原生核心:
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
相關文章
- GNU與Linux2013-11-11Linux
- 【Linux】Linux安全加固指令碼2019-05-12Linux指令碼
- 伺服器安全加固 - Linux2022-04-29伺服器Linux
- linux伺服器基線加固、安全漏掃工具(綠盟...)掃出來的系統漏洞2020-12-05Linux伺服器
- 域伺服器基礎設施設定與安全加固2022-03-06伺服器
- linux 賬號密碼安全加固2015-01-14Linux密碼
- GNU與Linux 的關係2024-09-01Linux
- ios安全加固 ios 加固方案2023-11-10iOS
- PbootCMS模板安全設定與加固方法2024-09-13boot
- nginx安全加固2017-11-28Nginx
- linux安全加固常見加密協議(續)2017-11-26Linux加密協議
- 深入分析Linux系統深度安全加固2008-01-25Linux
- 系統安全加固2020-04-11
- JavaScript混淆安全加固2019-06-09JavaScript
- 密碼安全加固2024-02-01密碼
- open Euler安全加固2024-07-12
- 頂象端加固保障App安全與合規2022-10-14APP
- 深入分析Linux系統深度安全加固(轉)2007-08-15Linux
- 在Linux中,如何進行系統安全加固?2024-05-28Linux
- MySQL安全加固方法分享2021-08-16MySql
- 深入分析Linux作業系統深度安全加固2008-11-22Linux作業系統
- GNU/Linux 常用命令與工具備忘2006-05-15Linux
- GNU 和 Linux(轉)2007-08-10Linux
- Nginx安全基線2024-11-04Nginx
- Linux系統下對NFS服務安全加固的方法2018-12-04LinuxNFS
- 無基線不安全!淺談安全基線檢查2022-02-23
- GNU是什麼?與Linux的不同之處在哪?2022-02-28Linux
- 神經工程與腦機介面資訊保安全景圖 V0.12020-11-20腦機介面
- MySQL安全配置基線2022-05-16MySql
- AIX作業系統安全加固2019-08-13AI作業系統
- iOS安全加固方法及實現2023-10-27iOS
- 基線linux2021-10-15Linux
- Unix、Linux、GNU 關係梳理2024-07-29Linux
- 【中介軟體安全】IIS6安全加固規範2018-12-24
- Redis服務安全加固的說明2020-02-13Redis
- Linux基礎優化與安全歸納總結2019-04-25Linux優化
- Linux基礎優化與安全重點小結2017-11-07Linux優化
- linux基礎:檔案安全與許可權(轉)2007-08-10Linux