tid=25799&vi /etc/ssh/sshd_config
) v) J$ G/ H" s7 u& L0 I) i3 R% ]* C2 g
1.修改預設 port (可用多行開啟多個 port)
1 h: Z+ \/ W' ?6 s* L3 b7 L7 RPort <port>3 T& y, V9 d4 Z
. l( r; R# Z' r4 Q3 x/ a
2.僅監聽特定 ip (適用於多網卡/多 IP 的情形)6 R, Z8 H# B8 u2 d5 p/ ?8 H8 ^
ListenAddress 192.168.1.100 r3 K& W, J& h% e5 f" v1 O1 V. u$ e
/ ]$ N/ f2 v' @1 E2 K
3.禁止 root 登入
! r, k1 u1 T' IPermitRootLogin no
: j. U8 f7 X# E) f6 E4 D* c% I管理者必須先以個人帳號登入,再 su 成 root,或利用 sudo 工作。9 ]1 y1 i4 M: D9 Q0 B; H3 h
z- g1 Y: C f5 I8 C$ x7 H- ~
4.禁止使用空密碼登入5 k0 z$ X. S" Y
PermitEmptyPasswords no3 f+ W# a! U, |' @3 j: Q% M( G2 W5 P
5 C) q8 J. d+ @4 M! q* t( `5.僅允許或拒絕特定帳號或群組登入
- c' z2 W9 M$ v% A% nAllowUsers <user1> <user2> <user3>
& ]3 `$ X: I6 BAllowGroups <group>
# G! u' V- K& Q( w# q% `DenyUsers *
7 S8 K9 n2 x$ ~0 \# ]DenyGroups no-ssh9 \4 ]! V# i) ?( W$ `' I
根據實驗,對於同一帳號而言,如果同時 Allow 跟 Deny 的話,結果會是 Deny 的。
! q$ q0 L* y1 Q% q0 B$ d$ h# ~0 `- i# H
6.廢除密碼登錄,強迫使用 RSA/DSA 驗證8 m" ^$ d$ k0 Z9 d0 F# R5 O7 _
RSAAuthentication yes
8 {( F6 |3 ~5 W% q; mPubkeyAuthentication yes
1 r- @0 d) s8 |1 NAuthorizedKeysFile %h/.ssh/authorized_keys
, L, o5 I2 X& S7 S% n% h$ KPasswordAuthentication no
. J$ Q6 [3 h1 h, J8 z並確保 user 的 ~/.ssh 權限為 700,同時將該 user 的 public key 加入其 ~/.ssh/authorized_keys 中。Public key 的產生方式可搜尋 ssh-keygen。+ X: f! y' z! g3 {" [
4 Y. e( f6 I% C8 G3 H5 I+ L$ r7.僅允許 SSHv20 _1 u: p1 q# w8 |# X
Protocol 2+ e& G* I) o# Z6 e9 J3 F8 O; [/ U
" A0 O6 _9 |4 B: N! Q4 w( g8.限制特定使用者、群組、主機或位址的登入行為,這裡以限制 somebody 與 handsomebody 不可使用密碼登入為例0 G. ~9 E; l ?; G; c L. l
Match User somebody,handsomebody
: h/ a) {# d, k/ fPasswordAuthentication no使用 TCP wrappers 限制來源 IP
# I2 t9 ]# Q$ c' j! \! r5 z) Y" J# vim /etc/hosts.deny
7 K/ k/ M% K5 ]$ F( r( \sshd: ALL9 `$ T7 u# l& ?" @9 B" s$ b
# vim /etc/hosts.allow
F7 J4 B) g* csshd: 192.168.1 1.2.3.4 # 僅允許 192.168.1.* 與 1.2.3.4 連線
' y# y; M# F' T( v+ N5 [: }* p. W. P Q
9.使用 iptables 限制來源 IP( S6 Q4 w% X6 T8 L1 z" x# @
# iptables -A INPUT -p tcp -m state --state NEW --source 1.2.3.4 --dport 22 -j ACCEPT
4 B# L, G7 ~8 O3 C* ~6 |* x# iptables -A INPUT -p tcp --dport 22 -j DROP
7 v- e, ^9 x `! g; \設定會立即生效,若希望重開機後還能保存,需要手動儲存 iptables 的設定。
, {2 X! G( n6 \- q! Y7 H6 {- @) Z/ L) i; w: D- Q, L
10.時間鎖定
# c& V: l* V: r; F. B5 h, z你可以使用不同的iptables參數來限制到SSH服務的連接,讓其在一個特定的時間範圍內可以連接,其他時間不能連接。你可以在下面的任何例子中使用 /second、/minute、/hour 或 /day 開關。* E% T+ N" @' m i% O% b
第一個例子,如果一個用戶輸入了錯誤的密碼,鎖定一分鐘內不允許在訪問SSH服務,這樣每個用戶在一分鐘內只能嘗試一次登陸) U3 U& D% U. K, l+ x6 G
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT u. {, a: { I1 P8 ?3 t2 H
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP9 {( X6 l: J) H7 T1 O8 |
第二個例子,設置iptables只允許主機193.180.177.13連接到SSH服務,在嘗試三次失敗登陸後,iptables允許該主機每分鐘嘗試一次登陸2 O5 A( L, }3 H1 ~
# 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 ACCEPT$ c# `6 A5 L. S2 U0 H
# iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP
' h2 u( _/ I5 E( Q) D- t! V1 b9 b) U0 K: T
11.檢查相關檔案權限,不安全則不允許登入
: i7 R4 e1 @: \; w% FStrictModes yes
; A) L" [& `- w* X9 f某些相關檔案權限設定若有錯誤時,可能造成安全性風險。如使用者的 ~/.ssh/authorized_keys 權限若為 666,可能造成其他人可以盜用帳號。
& \5 `5 |# w% Q( D6 h1 b0 Y- [" L# E+ A
12.自訂使用者登入時顯示的 banner (話說這跟安全性有什麼關係...? 大概可以用社交方式嚇跑壞人吧...= =a)
$ r8 _ I$ o+ o$ P) FBanner /etc/ssh/banner # 任意文字檔
( q2 p. J9 I' L2 P; ~6 d/ q+ a! w7 }+ a) n6 H* H b& `6 W
13.限制 su/sudo 名單
) r, j0 f: o( R2 O% p1 o# _# T7 \# vi /etc/pam.d/su8 C% {# z9 k: E4 n$ u
auth required /lib/security/$ISA/pam_wheel.so use_uid
4 w& |% w- j1 f: c$ C1 L8 r# visudo' [4 u1 \6 L6 {- e" X: c/ }6 t
%wheel ALL = (ALL) ALL# g: `+ o* C) `
# gpasswd -a user1 wheel
- R7 J3 J0 ^) m# x! C/ u. X( } ~; o9 n9 J
14.限制 ssh 使用者名單 ^ y s/ |$ s- y9 P; B, w5 u! l+ n
# vi /etc/pam.d/sshd
3 q/ d( ]0 w* T h: } auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users onerr=fail
- H& u0 M; r& A( B3 N* { e# echo <username> >> /etc/ssh_users; c8 ?2 X+ S; L1 i5 j" ^! E
15.防止SSH連線逾時(timeout),讓PuTTY 與 SSH 一直保持連線# |- V) O4 d% h3 D2 H. x. Q
修改/etc/ssh/sshd_config
8 [+ c( k& A( J) X#TCPKeepAlive yes0 U3 l& p# W" q+ o
#ClientAliveInterval 0* L+ P" |& N6 K% r; Z( j
#ClientAliveCountMax 3
' O. c- P) g$ `7 C2 x- ? 將#拿掉==>存檔" t4 o+ r- z! Z4 _( s
#service ssd restart ==>重啟sshd- l% a2 a& n" y& n+ T G
接下來修改 Pietty 的參數,進入”PuTTY 連線設定”:
' a$ ^: Z7 y$ X/ I1 _* o0 X+ R# H 選擇「Connection」項目,將「Seconds between keepalives [0 to turn off]」右邊的欄位輸入每隔幾秒,傳送一個null封包以保持連線。
2 S9 j2 M) _$ U( {( F2 q
) U. y8 `% S7 u7 r! Y& N |