在開通了 Linux 系統的 VPS 或伺服器後,我們有必要做一些基本的安全設定。
大概有如下幾個方面:
1. 禁止root帳號ssh,使用自訂帳號ssh;
這樣一來,駭客要先猜到帳號,然後才能猜解密碼;
2. 禁止帳號登入,使用pubkey登入;
3. 作ip ACL,只允許幾個特定的IP訪問;
4. ssh連接埠遷移,將預設22連接埠改為其他連接埠;
5. 啟動盡量少的服務;如無必要,不起服務。
配置開始
一、關閉 SSH 密碼登陸
首先,你需要有自己的 SSH Key,如果你使用 Windows 系統,可以用 Putty 下的 PUTTYGEN.EXE 產生私匙和公匙。
第一步,運行 PUTTYGEN.EXE
一般,我們選擇預設的 RSA 加密即可,預設的 1024 位加密足夠用,如果要保險點,可以選擇 2048 或 4096 位加密,如圖紅圈處:
第二步,點擊 Generate ,然後滑鼠隨意在空白處移動
等進度條滿了,就產生好你的 SSH Key 了:
如果要更安全一點,可以設定 Key Passphrase ,也就是密碼,這個密碼和 root 密碼不同,一旦別人擷取了你的 Key ,沒有這個密碼他也載入不了你的 Key。
第三步,點擊 Save Public Key 儲存你的公匙,整個檔案如下
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "showfom-rsa-key-20130701"
AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdw
HEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzU
XDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3
681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2h
ciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUj
Lj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ==
---- END SSH2 PUBLIC KEY ----
其中中間那麼長長的一串,就是你的公匙了,可以放在伺服器的 ~/.ssh/authorized_keys ,我們應採取以下的格式:ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701
其中 ssh-rsa 為加密類型, showfom-rsa-key-20130701 為說明,可以是任意文本,如 showfom-notebook
第四步,點擊 Save Private Key 產生用於 Putty 的私匙,這裡我們儲存為 showfom.ppk ,整個檔案如下
PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: Showfom
Public-Lines: 4
AAAAB3NzaC1yc2EAAAABJQAAAIBTILl54rOaEEkv95VKR6IEZ9Y0d1IpNNQeyk+e
yHPtc7jVTmfL0oiho9s2UqquaNGmLmzLjhXRj3cPZ1VZInPFqVtgWYKWPEpGckGI
7/iTpNUuz6tKguEi5RYaEtfgKWF13qC5S8dWlk2FGv7dY5GbSoZMHZtc+zTL9Jpn
NCa5nw==
Private-Lines: 8
AAAAgEWly9TSsiciZtUpYWe/eegD+Kh/pbPSUNuG6MNOAEN8ocd5Ctsz2kI9LUkw
gSpX0j8f+kmuZU62eIKHAlGZZ+nVyklcHE7qFO2AyMCuniUYm0mgdN5gjXUBFduV
VTjIaYwd282Yo0xtjPWN0DJF3jmmsrw6pwMwaa6r6pAlKANtAAAAQQClYrYCu3eu
0GcGw9G2MVLIZoHoKYPL2e6HjfPQhvsze6AKUzpTF/DGMkBFY6dH//0zSoHue2jn
gNsaLQygBvT/AAAAQQCArGNL76eXHtR28TRY2PONg8ij3YN9mCzYG3sDsV8feGAk
RyZ8T5b6xZuf9UyvZ1lIA10i7ULZ63s2hvCZUxthAAAAQD+auXN8fUAylROh8zTM
14FyY7GRwdN7y7+EtZ8NuVDLvZP9Svpd4V5Ti9LpqjtiUcp0eELCd5i7zxyV2oHe
U78=
Private-MAC: ce0968aff198e2c2550704625b23ba7575e6b260
這個 showfom.ppk 你需要通過 Putty 目錄下的 PAGEANT.EXE 匯入,這樣你就可以不需要輸入 root 密碼即可登入你的 VPS。
PS: WinSCP 和 Putty 的 SSH Key 是通用的,只需要匯入一次即可。
但是 Putty 的 Private Key 是不標準的,只能用於 Putty 或 WinSCP ,如果你使用 Xshell 4 ,則需要轉換成 rsa 檔案,可以在 PUTTYGEN.EXE 上方菜單裡的 Conversions > Export OpenSSH Key 方式轉換。
第五步,匯入你的 Linux VPS 或伺服器
如果你本地是 Linux 案頭環境,可以很簡單的一條命令搞定:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@198.51.100.100
但是大多數使用者還是 Windows 使用者,所以我建議兩種比較簡單的方法
1、把自己的公匙放在 https://launchpad.net/ 網站,並得到類似 https://launchpad.net/~showfom/+sshkeys 這樣的地址,然後通過以下命令匯入你的 Key
curl https://launchpad.net/~showfom/+sshkeys > ~/.ssh/authorized_keys
2、也可以直接寫入 authorized_keys 檔案
cat >>/root/.ssh/authorized_keys<<EOF
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAna/D52fTZ1YNjxnwAJAUhxRdPCwar8ZfWLdwHEmT64Zqtxrz65KRxesHFRVND8Xn1GKtuQIQMu/d5fFhEajFbjoSw/n+Mz58irzUXDbE34Y/nxy1/iWc6aJz6lX6wT7nnDcVoqX8Be8j/8sjS7cMFarn3Iy+0bSQNON3681+hEFM7mpoYyqrCVBpARfiiEZb8tNkfzrKJFrciZ87yaKkncPeDCIbYKjuJY2hciK+Y+IptLdoMj5kQkSXStJFQUfFg+s3FQJ9Istu4C7BF3ZafD4mEupA7P90RRUjLj95mUW/P/ebWGsMVbnxz/Xmq3OL/TOuo85umbSN44DmSB3NEQ== showfom-rsa-key-20130701
在某些服務商的 CentOS 系統裡,由於開啟了 SELinux ,預設是禁止了 .ssh 目錄的許可權的,可以用下面的命令釋放保留:
restorecon -R -v /root/.ssh
如果遇到 authorized_keys 許可權問題,可用如下命令解決:
chattr -i authorized_keys
然後你可以重啟開啟一個 SSH 視窗,測試是否不需要輸入密碼即可用 root 登陸。
第六步,關閉 SSH 密碼登陸
編輯 SSH 設定檔:
vim /etc/ssh/sshd_config
找到
#PasswordAuthentication yes
並改為
PasswordAuthentication no
儲存,退出,重啟 SSH 服務
Ubuntu 下:
/etc/init.d/ssh restart
CentOS 下:
/etc/init.d/sshd restart
好了,這樣禁止 SSH 密碼登陸就大功告成,這一步就拒絕了 90% 的入侵危險,當然,你自己的私匙一定要儲存好,否則被別人偷走可是不要求輸入密碼就能進你的伺服器哦。
二、安裝 CSF 防火牆屏蔽嘗試入侵伺服器的 IP
CSF 防火牆安裝略簡單,幾個命令即可搞定:
rm -fv csf.tgz
wget http://www.configserver.com/free/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
然後運行 perl /usr/local/csf/bin/csftest.pl 檢測是否安裝成功
為了防止系統誤屏蔽本地 IP,可以修改 /etc/csf/csf.allow 和 /etc/csf/csf.ignore 檔案加入你需要的白名單 IP ,然後用 csf -r 命令重啟讀取設定檔即可。
三、用 iptables 只開啟常規連接埠
一般我們只需要開啟 22, 53, 80, 443 這三個常見的對外開放連接埠,可以使用如下命令
清空 iptables 預設規則
iptables -F
允許 22 連接埠進入和返回
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
允許 53 連接埠,一般作為 DNS 服務使用
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
允許本機訪問本機
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
允許所有 IP 訪問 80 和 443 連接埠,一般作為 http 和 https 用途
iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
儲存配置
iptables-save > /etc/sysconfig/iptables
重新載入 iptables
iptables -L
四、安裝 fail2ban 屏蔽並舉報掃描 SSH 連接埠的 IP
有很多精力旺盛的傢伙會整天掃描 SSH 密碼,當然直接關閉 SSH 密碼登陸即可防止,但是為了給他們一點教訓,可以安裝 fail2ban ,屏蔽之餘,還能自動寫舉報信給 IP 所在的 ISP。
CentOS 下安裝:
匯入 epel 源:
CentOS 6.x 32 位:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
CentOS 6.x 64 位元:
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
安裝 fail2ban
yum -y install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
service fail2ban start
Ubuntu / Debian 下安裝:
apt-get install fail2ban -y
通過查看 /var/log/fail2ban.log 檔案即可知道有哪些精力過剩的傢伙在整天掃描你的 SSH 了。
使用者管理
使用者權限
1)限制root
echo "tty1" > /etc/securetty
chmod 700 /root
2)密碼原則
echo "Passwords expire every 180 days"
perl -npe 's/PASS_MAX_DAYSs+99999/PASS_MAX_DAYS 180/' -i /etc/login.defs
echo "Passwords may only be changed once a day"
perl -npe 's/PASS_MIN_DAYSs+0/PASS_MIN_DAYS 1/g' -i /etc/login.defs
用sha512保護密碼而不用md5
authconfig --passalgo=sha512 --update
3)umask限制
更改umask為077
perl -npe 's/umasks+0d2/umask 077/g' -i /etc/bashrc
perl -npe 's/umasks+0d2/umask 077/g' -i /etc/csh.cshrc
4)Pam修改
touch /var/log/tallylog
cat << 'EOF' > /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
auth required pam_tally2.so deny=3 onerr=fail unlock_time=60
account required pam_unix.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
account required pam_tally2.so per_user
password requisite pam_cracklib.so try_first_pass retry=3 minlen=9 lcredit=-2 ucredit=-2 dcredit=-2 ocredit=-2
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=10
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
EOF
/var/log/tallylog是二進位日誌,記錄認證失敗情況。可以使用pam_tally2 --reset -u username解鎖
5)回收閑置使用者
echo "Idle users will be removed after 15 minutes"
echo "readonly TMOUT=900" >> /etc/profile.d/os-security.sh
echo "readonly HISTFILE" >> /etc/profile.d/os-security.sh
chmod +x /etc/profile.d/os-security.sh
6)cron和at限制
echo "Locking down Cron"
touch /etc/cron.allow
chmod 600 /etc/cron.allow
awk -F: '{print $1}' /etc/passwd | grep -v root > /etc/cron.deny
echo "Locking down AT"
touch /etc/at.allow
chmod 600 /etc/at.allow
awk -F: '{print $1}' /etc/passwd | grep -v root > /etc/at.deny
刪除系統特殊的的使用者和組
userdel username
userdel adm
userdel lp
userdel sync
userdel shutdown
userdel halt
userdel news
userdel uucp
userdel operator
userdel games
userdel gopher
以上所刪除使用者為系統預設建立,但是在常用伺服器中基本不使用的一些帳號,但是這些帳號常被駭客利用和攻擊伺服器。
groupdel username
groupdel adm
groupdel lp
groupdel news
groupdel uucp
groupdel games
groupdel dip
同樣,以上刪除的是系統安裝是預設建立的一些組帳號。這樣就減少受攻擊的機會。
服務管理
關閉系統不使用的服務
chkconfig level 35 apmd off
chkconfig level 35 netfs off
chkconfig level 35 yppasswdd off
chkconfig level 35 ypserv off
chkconfig level 35 dhcpd off?
chkconfig level 35 portmap off
chkconfig level 35 lpd off
chkconfig level 35 nfs off
chkconfig level 35 sendmail off
chkconfig level 35 snmpd off
chkconfig level 35 rstatd off
chkconfig level 35 atd off??
定期更新系統
yum -y update,可以加入到cron job。
ssh服務安全
使用認證登入系統,具體不詳述,請看這篇文章http://www.centos.bz/2012/02/strengthen-ssh-security-login-with-certificate/
LAMP安全
系統檔案許可權
修改init目錄檔案執行許可權
chmod -R 700 /etc/init.d/*
修改部分系統檔案的SUID和SGID的許可權
chmod a-s /usr/bin/chage
chmod a-s /usr/bin/gpasswd
chmod a-s /usr/bin/wall
chmod a-s /usr/bin/chfn
chmod a-s /usr/bin/chsh
chmod a-s /usr/bin/newgrp
chmod a-s /usr/bin/write
chmod a-s /usr/sbin/usernetctl
chmod a-s /usr/sbin/traceroute
chmod a-s /bin/mount
chmod a-s /bin/umount
chmod a-s /bin/ping
chmod a-s /sbin/netreport
修改系統引導檔案
chmod 600 /etc/grub.conf
chattr +i /etc/grub.conf
日誌管理
1、系統引導日誌
dmesg
使用 dmesg 命令可以快速查看最後一次系統引導的引導日誌。通常它的內容會很多,所以您往往會希望將其通過管道傳輸到一個閱讀器。
2、系統作業記錄
A、Linux 日誌儲存在 /var/log 目錄中。
這裡有幾個由系統維護的記錄檔,但其他服務和程式也可能會把它們的日誌放在這裡。大多數日誌只有 root 才可以讀,不過只需要修改檔案的存取權限就可以讓其他人可讀。
以下是常用的系統記錄檔名稱及其描述:
lastlog 記錄使用者最後一次成功登入時間
loginlog 不良的登陸嘗試記錄?
messages 記錄輸出到系統主控台以及由syslog系統服務程式產生的訊息
utmp 記錄當前登入的每個使用者
utmpx 擴充的utmp
wtmp 記錄每一次使用者登入和登出的曆史資訊 wtmpx 擴充的wtmp
vold.log 記錄使用外部介質出現的錯誤
xferkig 記錄Ftp的存取情況 sulog 記錄su命令的使用方式
acct 記錄每個使用者使用過的命令
aculog 撥出自動通訊記錄
B、/var/log/messages
messages 日誌是核心系統記錄檔。它包含了系統啟動時的引導訊息,以及系統運行時的其他狀態訊息。IO 錯誤、網路錯誤和其他系統錯誤都會記錄到這個檔案中。其他資訊,比如某個人的身份切換為 root,也在這裡列出。如果服務正在運行,比如 DHCP 伺服器,您可以在messages 檔案中觀察它的活動。通常,/var/log/messages 是您在做故障診斷時首先要查看的檔案。
C、/var/log/XFree86.0.log
這個日誌記錄的是 Xfree86 Xwindows 伺服器最後一次執行的結果。如果您在啟動到圖形模式時遇到了問題,一般情況從這個檔案中會找到失敗的原因。
網路安全
使用TCP_WRAPPERS
使用TCP_WRAPPERS可以使你的系統安全面對外部入侵。最好的策略就是阻止所有
的主機(在"/etc/hosts.deny" 檔案中加入"ALL: ALL@ALL, PARANOID" ),然後再在"/etc/hosts.allow" 檔案中加入所有允許訪問的主機列表。
第一步:
編輯hosts.deny檔案(vi /etc/hosts.deny),加入下面這行
# Deny access to everyone.
ALL: ALL@ALL, PARANOID
這表明除非該地址包好在允許訪問的主機列表中,否則阻塞所有的服務和地址。
第二步:
編輯hosts.allow檔案(vi /etc/hosts.allow),加入允許訪問的主機列表,比
如:
ftp: 202.54.15.99 foo.com
202.54.15.99和 foo.com是允許訪問ftp服務的ip地址和主機名稱。
第三步:
tcpdchk程式是tepd wrapper設定檢查程式。它用來檢查你的tcp wrapper設定,並報告發現的潛在的和真實的問題。設定完後,運行下面這個命令:
[Root@kapil /]# tcpdchk
iptables防火牆使用
Web伺服器的iptables規則
IPT="/sbin/iptables"
$IPT --delete-chain
$IPT --flush
$IPT -P INPUT DROP #1
$IPT -P FORWARD DROP #1
$IPT -P OUTPUT DROP #1
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #2
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT #3
$IPT -A INPUT -i lo -j ACCEPT #4
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #5
$IPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #5
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #6
$IPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT #7
$IPT -A OUTPUT -o lo -j ACCEPT #4
$IPT -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT #8
$IPT -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT #9
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #10
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #10
service iptables save
service iptables restart
存為指令碼iptables.sh,執行sh iptables.sh自動設定防火牆。
解釋:
#1、設定INPUT,FORWARD,OUTPUT鏈預設target為DROP,也就是外部與伺服器不能通訊。
#2、設定當串連狀態為RELATED和ESTABLISHED時,允許資料進入伺服器。
#3、設定外部客戶端串連伺服器連接埠80,22,21,873。
#4、允許內部資料循回。
#5、允許外部ping伺服器 。
#6、設定狀態為RELATED和ESTABLISHED的資料可以從伺服器發送到外部。
#7、允許伺服器使用外部dns解析網域名稱。
#8、設定伺服器串連外部伺服器連接埠80。
#9、允許伺服器發送郵件。
#10、允許從伺服器ping外部。