vi /etc/ssh/sshd_config L! C# J8 d6 s, a! _+ N
& k1 Z# s4 g; X; R, x: S- W& b1.修改預設 port (可用多行開啟多個 port); t6 L$ D4 F$ r! b$ Z( w0 v
Port <port>
) q( G5 h! c3 E6 h' W% j- @' }8 H' g; n8 e0 z, @, B8 [3 b
2.僅監聽特定 ip (適用於多網卡/多 IP 的情形)1 z% ^) N, K. ?) v* L
ListenAddress 192.168.1.108 ?' c, E) e+ `! }4 c l* Z- i
3 `3 w: i8 i' m( f) W3.禁止 root 登入7 {. z( I1 N f- a( m M$ N
PermitRootLogin no. {2 r: K1 |4 X/ Q* W; y3 e, @# ^
管理者必須先以個人帳號登入,再 su 成 root,或利用 sudo 工作。
: Z$ _( S8 y+ m+ G v9 N& ~2 O/ d$ d8 Z3 T% Q5 \' |. }
4.禁止使用空密碼登入, X6 j" x! U: _8 E0 n8 @
PermitEmptyPasswords no2 r$ i" a$ a4 j* J% J
/ _! r/ j% {1 w# {# f5.僅允許或拒絕特定帳號或群組登入+ G. z. C% [0 f2 \/ p: @) y; E) \
AllowUsers <user1> <user2> <user3>% O4 Z9 t2 c. b6 v
AllowGroups <group>3 c- r1 p% g# h9 Y
DenyUsers *
3 L/ R; i# t! P5 |" a5 KDenyGroups no-ssh" R# g, `. c: K; m/ {$ z: o
根據實驗,對於同一帳號而言,如果同時 Allow 跟 Deny 的話,結果會是 Deny 的。/ O. p7 U2 A- e+ p# k, ?5 |9 o
5 u8 u! m# p. y# Q, x6.廢除密碼登錄,強迫使用 RSA/DSA 驗證
. \( x, D0 u- IRSAAuthentication yes/ {( g. L4 g# M! X6 b
PubkeyAuthentication yes
! m9 o# O( z. P( C1 v% c; s+ sAuthorizedKeysFile %h/.ssh/authorized_keys
$ L) W: I" K( Y. @2 {PasswordAuthentication no
2 }3 I5 }0 M, W0 T: ^0 V6 L並確保 user 的 ~/.ssh 權限為 700,同時將該 user 的 public key 加入其 ~/.ssh/authorized_keys 中。Public key 的產生方式可搜尋 ssh-keygen。: G# ~* i/ n" S* }9 C* o
2 C* w2 h* R& q+ h# e5 U) Z/ A( S
7.僅允許 SSHv2+ ^! W9 D' V) L5 c
Protocol 2 K8 E- S+ c$ x6 p" t' E
* y/ |* F% o x# l; e C4 ^+ K8.限制特定使用者、群組、主機或位址的登入行為,這裡以限制 somebody 與 handsomebody 不可使用密碼登入為例- E$ w2 O6 V1 d7 G; R. X
Match User somebody,handsomebody
) b( y+ q) O9 ^& z9 ^9 DPasswordAuthentication no使用 TCP wrappers 限制來源 IP
; \4 _2 L7 q1 ?( d6 \; l# vim /etc/hosts.deny
; ?' L {. d+ Z/ p ? L& vsshd: ALL$ c" T- i% C6 M7 {: W
# vim /etc/hosts.allow
) v5 t" W. h3 i2 X: Dsshd: 192.168.1 1.2.3.4 # 僅允許 192.168.1.* 與 1.2.3.4 連線
) M8 t5 T/ ]3 T3 ]* \6 r2 S8 Z1 q- |( n
9.使用 iptables 限制來源 IP7 |. V( _ _ r2 i
# iptables -A INPUT -p tcp -m state --state NEW --source 1.2.3.4 --dport 22 -j ACCEPT
2 P+ Q- L0 Q9 a# iptables -A INPUT -p tcp --dport 22 -j DROP
: E9 K( s+ O1 ~+ a$ g6 }, ]設定會立即生效,若希望重開機後還能保存,需要手動儲存 iptables 的設定。* k# x6 A T2 S7 s% R6 @+ j
# A. `' f! I+ R5 d6 F
10.時間鎖定
0 M1 x: O: h2 T& |, K* _5 u- W, t你可以使用不同的iptables參數來限制到SSH服務的連接,讓其在一個特定的時間範圍內可以連接,其他時間不能連接。你可以在下面的任何例子中使用 /second、/minute、/hour 或 /day 開關。
# v" G- M! t' v' H" I: H: `第一個例子,如果一個用戶輸入了錯誤的密碼,鎖定一分鐘內不允許在訪問SSH服務,這樣每個用戶在一分鐘內只能嘗試一次登陸
7 S* J! k: B2 f3 R& R4 r4 W' P # iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT" y* s, V; {# f( z3 a" r
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
% O6 U5 x) a3 M1 h. c/ V7 s4 B第二個例子,設置iptables只允許主機193.180.177.13連接到SSH服務,在嘗試三次失敗登陸後,iptables允許該主機每分鐘嘗試一次登陸6 l0 Q; I* H# R
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT4 }; {* |* E3 f
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP F) E) g9 Y# g7 \
. E2 ~* A# L$ R( c# M2 p/ I/ ?11.檢查相關檔案權限,不安全則不允許登入
& R5 B; C4 A Q* t. QStrictModes yes5 }$ |" i3 H+ v) ]' K% x$ D1 Q
某些相關檔案權限設定若有錯誤時,可能造成安全性風險。如使用者的 ~/.ssh/authorized_keys 權限若為 666,可能造成其他人可以盜用帳號。
0 y8 O0 c( P/ _6 ~+ q, a0 y8 }% ~& m# q8 R. m
12.自訂使用者登入時顯示的 banner (話說這跟安全性有什麼關係...? 大概可以用社交方式嚇跑壞人吧...= =a)
3 t% i$ K7 ?/ n* m1 @% JBanner /etc/ssh/banner # 任意文字檔3 ^* G% W9 ^& w
: R% M: N* a) S& Q13.限制 su/sudo 名單
5 C! ^, x7 e m- b5 o# vi /etc/pam.d/su
$ e+ H5 X7 N, @- I: B auth required /lib/security/$ISA/pam_wheel.so use_uid* X* J5 y! u0 J4 v9 s
# visudo% A3 m {4 v/ M* j: D( J6 \) |/ c s
%wheel ALL = (ALL) ALL
5 d4 f9 ~) x. \9 o5 l# gpasswd -a user1 wheel
. I+ j4 J. Z1 q! X, c( l
, y8 l- m. N$ M3 \9 g14.限制 ssh 使用者名單/ z0 S8 `% {& F/ _
# vi /etc/pam.d/sshd4 p* y9 n& j9 l" c. R, ]7 k
auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users onerr=fail1 Z9 _% _# ?4 K' ^% R, B
# echo <username> >> /etc/ssh_users
9 F# T: k4 f3 Z; d15.防止SSH連線逾時(timeout),讓PuTTY 與 SSH 一直保持連線* |6 P0 Z! A h0 s+ Q. d
修改/etc/ssh/sshd_config7 `; M0 z5 A1 Z4 ]' y
#TCPKeepAlive yes5 ^/ p! f2 x9 S/ ]+ c
#ClientAliveInterval 09 Q! K5 K: d* \! @* K6 w2 t
#ClientAliveCountMax 3
- \/ _5 [% u9 y 將#拿掉==>存檔! E! }5 y9 C2 v: a: Y
#service ssd restart ==>重啟sshd
0 n) `; q+ S: m, ^5 K 接下來修改 Pietty 的參數,進入”PuTTY 連線設定”:& x1 e, c; V# r& R
選擇「Connection」項目,將「Seconds between keepalives [0 to turn off]」右邊的欄位輸入每隔幾秒,傳送一個null封包以保持連線。 B; U2 S# i3 J
: `9 c+ u& y- }9 G+ Q |
|