vi /etc/ssh/sshd_config
9 x' `) X; a' L5 x K; g- }5 ^6 Y4 c G% @
1.修改預設 port (可用多行開啟多個 port)
. q+ c8 X4 \$ ?# @; @8 ?* vPort <port>
* [9 N. i: ^9 \4 S$ w% Y6 _8 g, x/ h. R2 m
2.僅監聽特定 ip (適用於多網卡/多 IP 的情形)
/ }% H% u$ S' C+ V* oListenAddress 192.168.1.10
]5 s6 \0 v% \5 S
0 q& |9 l( m! ]9 S4 ]! X3.禁止 root 登入
7 k/ h; M ?9 A' jPermitRootLogin no
9 ?' P# _% I; {( Q Q2 U管理者必須先以個人帳號登入,再 su 成 root,或利用 sudo 工作。9 g" C4 `+ C/ A5 ~" R" f+ G
* e/ j* {- \$ g& s+ N4 }
4.禁止使用空密碼登入/ h% ?! V+ [# t6 j: K% }
PermitEmptyPasswords no
2 a4 p3 Q/ {; H7 y$ G8 R, O- T6 L F3 k4 b" B5 Y: j' Y
5.僅允許或拒絕特定帳號或群組登入
( E' v' I+ O0 xAllowUsers <user1> <user2> <user3> C6 E7 H: y) Z
AllowGroups <group># z0 |5 P- B3 p4 H! ^& b
DenyUsers *! O7 V2 V! ?8 r6 f% z3 `( O
DenyGroups no-ssh
6 ]( z* ?6 z( L4 T" f. z8 Q6 N根據實驗,對於同一帳號而言,如果同時 Allow 跟 Deny 的話,結果會是 Deny 的。
" G; w2 p/ s) Y9 m3 b0 }& \4 U! x& Z8 q
6.廢除密碼登錄,強迫使用 RSA/DSA 驗證
+ H0 Y: V J( W; F7 V, G& [RSAAuthentication yes
+ s* V& d- u: ?' I/ LPubkeyAuthentication yes
3 Q6 k, [ D' F& x; tAuthorizedKeysFile %h/.ssh/authorized_keys5 ]1 y- X7 Q0 j# q% |
PasswordAuthentication no( p8 o6 Q! u) H( {
並確保 user 的 ~/.ssh 權限為 700,同時將該 user 的 public key 加入其 ~/.ssh/authorized_keys 中。Public key 的產生方式可搜尋 ssh-keygen。) `" I5 C, q/ D6 q) F
7 h5 \% { B+ G6 ?
7.僅允許 SSHv2
; ]% q+ J* S3 z- ^- x6 @Protocol 2
: J+ G6 J5 C m# ]9 Q2 e6 s l" E0 H0 }8 Q1 _/ I6 \/ r5 N& g! Y
8.限制特定使用者、群組、主機或位址的登入行為,這裡以限制 somebody 與 handsomebody 不可使用密碼登入為例
% o$ S9 t6 [ u( A$ j" R. ]2 NMatch User somebody,handsomebody6 Z; ]. F8 E( J/ p. I
PasswordAuthentication no使用 TCP wrappers 限制來源 IP
% O/ ~# n- i0 F9 M8 s# vim /etc/hosts.deny
1 q% Z) Y2 P! Z) zsshd: ALL+ v. o7 e7 ?0 g
# vim /etc/hosts.allow5 Y. C0 ? S @1 Y/ P
sshd: 192.168.1 1.2.3.4 # 僅允許 192.168.1.* 與 1.2.3.4 連線( M; o b9 ?: v% B! |( N9 l; e
. x+ x+ v# T' K& e9.使用 iptables 限制來源 IP" H8 H; N* c) i$ y& f
# iptables -A INPUT -p tcp -m state --state NEW --source 1.2.3.4 --dport 22 -j ACCEPT
+ J0 @7 o' B% R' `) c1 Q# iptables -A INPUT -p tcp --dport 22 -j DROP
$ R) S* p+ C2 a* i; N8 Z: J設定會立即生效,若希望重開機後還能保存,需要手動儲存 iptables 的設定。- h# z- {7 A3 U- [. E T
4 m- ^$ Z& J% `$ E& C10.時間鎖定
) ?' L* i- g9 }$ Y" H# t你可以使用不同的iptables參數來限制到SSH服務的連接,讓其在一個特定的時間範圍內可以連接,其他時間不能連接。你可以在下面的任何例子中使用 /second、/minute、/hour 或 /day 開關。
5 i* S, V* n2 `( h0 g* w第一個例子,如果一個用戶輸入了錯誤的密碼,鎖定一分鐘內不允許在訪問SSH服務,這樣每個用戶在一分鐘內只能嘗試一次登陸
9 Q6 x* `; k/ T3 T1 [ # iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT/ \2 e" o0 b0 }3 E. Q5 D/ d
# iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
! d- u) \0 ^ R第二個例子,設置iptables只允許主機193.180.177.13連接到SSH服務,在嘗試三次失敗登陸後,iptables允許該主機每分鐘嘗試一次登陸
/ e/ D& c: @( ]8 Q # 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
1 d: G! Y) l3 g. _ # iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP
1 ~! \# j# y6 Q
! a6 v. C7 {- c2 h9 ~11.檢查相關檔案權限,不安全則不允許登入! a: s6 ` D% G* u4 E
StrictModes yes6 N3 C" W1 e0 y( Y
某些相關檔案權限設定若有錯誤時,可能造成安全性風險。如使用者的 ~/.ssh/authorized_keys 權限若為 666,可能造成其他人可以盜用帳號。
! P* ~* i1 n2 _# I* N: X/ Z' ?& W2 J* }: s) T
12.自訂使用者登入時顯示的 banner (話說這跟安全性有什麼關係...? 大概可以用社交方式嚇跑壞人吧...= =a)
2 V1 m" Z$ w" c$ ^2 [- `3 g- `1 j% ABanner /etc/ssh/banner # 任意文字檔9 ?/ S( i- L* B3 N, B4 ~: I
3 ]9 L' f4 F& {- ?13.限制 su/sudo 名單
}# n$ @2 ^4 W: E6 s& _& [* y# vi /etc/pam.d/su; a- f; j2 Q% w0 [& S
auth required /lib/security/$ISA/pam_wheel.so use_uid
7 d0 v7 I3 [$ `; N- x* j5 n# visudo
4 @+ k' x& x& z1 E r! U %wheel ALL = (ALL) ALL& U' j& Z3 }) h; R! I5 N
# gpasswd -a user1 wheel
) m+ P j5 ~9 K' |# ]1 S4 T
. k# S( o/ H5 }$ Q/ _ d u14.限制 ssh 使用者名單
X5 |2 \! r& P' N. y# vi /etc/pam.d/sshd: k" O: \) p- L. s
auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users onerr=fail8 N* n: J* A% d
# echo <username> >> /etc/ssh_users
8 j/ T& @( {6 c3 g: e15.防止SSH連線逾時(timeout),讓PuTTY 與 SSH 一直保持連線
8 h8 U5 i7 b- @4 w, R- p$ Y) D 修改/etc/ssh/sshd_config- f, s9 i$ E" j3 t
#TCPKeepAlive yes. k6 W1 c, P" e/ m& q; w6 k6 c2 ^! z
#ClientAliveInterval 0' R% K: g. y- E
#ClientAliveCountMax 3
) G2 ^; C5 ^) m$ h 將#拿掉==>存檔
" e" l+ @4 U4 `5 H! q% k#service ssd restart ==>重啟sshd
& H# X' M: a3 b+ H$ Z5 U1 ?( E. Z3 c 接下來修改 Pietty 的參數,進入”PuTTY 連線設定”:
6 z: t+ Q8 J/ [4 T 選擇「Connection」項目,將「Seconds between keepalives [0 to turn off]」右邊的欄位輸入每隔幾秒,傳送一個null封包以保持連線。
, J6 D, v+ h/ G4 q$ ^
. y8 Y0 U2 m- z" e5 \ |
|