<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/2621

            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

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线