GNU/Linux安全基線與加固-0.1

wyzsk發表於2020-08-19
作者: insight-labs · 2014/07/23 14:46

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

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章