技術討論區 > 系統安全討論版

[整理]sshd 安全設定 ( 設定"禁止使用ssh名單" )

<< < (2/7) > >>

leafmouse:

--- 引述: "netman" ---auth   required   pam_listfile.so item=user sense=allow file=/etc/ssh/allow_list onerr=succeed

一般來說, 若 sense=allow 的話, 那 onerr 就不要設 succeed , 而要設為 fail .
--- 引用結尾 ---


感謝netman前輩的指教,目前也改成onerr=fail了
pam認證的東西並不是很懂,不過之前有試過onerr=succeed
時一樣只有allow_list檔案裡的帳號才能登入所以就沒想那麼多了
有空再去找一下這些資料,謝謝您囉 ^^

netman:
呵... 別客氣, 感謝你來跟大家交流心得呢!

filelist module 的 onerr 是指讀取 file 時碰到錯誤.
然後其後的 succeed 與 fail 是指前面的 sense 是否要達成, 而不是指 pam 返回的結果.
我所提到的 sense=allow 然後 onerr=fail 只是一般的通用設法. 具體的環境或有不同.

既然大家對 ssh 的控管有興趣, 那我再補充一個控管方法:
1) 將 sshd 的 firewall 連線全部 block 掉.
2) 然後在 httpd 那設一個 directory, 可設 ssl+htpasswd+allow/deny control,
然後在目錄內寫一個 php 將 browser ip 記錄於一份 .txt 文字檔裡.
視你的轉寫能力, 你可自動抓取 browser 端的 IP, 也可讓 browser 端傳入參數來指定.
文字檔只有單一記錄, 每次蓋寫.
3) 修改 /etc/services , 增加一個新項目(如 xxx), 並指定一個新 port(如 1111)
4) 再用 xinetd 監聽該 port , 並啟動令一隻 script, 設定 iptables , 從 step2 的清單裡取得 IP, 為之打開 ssh 連線.
5) 設 crontab 每數分中清理 iptables 關於 ssh 連線的規則. 這並不影響既有連線, 若逾時再連, 則重複上述.

具體的設定我這裡暫時不寫了, 看得懂的人, 一定有自己的方法的...  ^_6

damon:
有更簡單的作法,也不用搞那麼複雜,就是只用public key做認證,也不會問密碼,不用擔心密碼洩漏,除非privite key外流,也不用作黑名單,就算帳號對,key不對,你的sshd會直接拒絕連線
你也不用每天手動maintain什麼黑名單這種東西,試試看吧,十分鐘內就可以做完了

netman:
嗯...

rsa auth 的方式, 對 ssh 或 ssl 本身的漏洞沒啥幫助.
也不能排除 client 機器遭"誤用", 比方一台被入侵, 其它全部受遷連.
之所以搞那麼複雜, 就是為了在你還沒修補之前給你"多"一份保護.

做 security, 最能應驗如下一句話:
--- 勿以善小不為, 勿以惡小為之!

netman:
再補一招:

先寫一個 shell script:

--- 代碼: ---#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

LOG_FILE=/var/log/secure
KEY_WORD="Illegal user"
KEY_WORD1="Failed password for root"
PERM_LIST=/etc/firewall/bad.list.perm
LIMIT=5
MAIL_TO=root
IPT_SAV="$(iptables-save)"
bad_list=$(egrep "$KEY_WORD" $LOG_FILE | awk '{print $NF}' | xargs)
bad_list1=$(egrep "$KEY_WORD1" $LOG_FILE | awk '{print $11}' | xargs)
bad_list="$bad_list $bad_list1"

for i in $(echo -e "${bad_list// /\n}" | sort -u)
do
        hit=$(echo $bad_list | egrep -o "$i" | wc -l)
        [ "$hit" -ge "$LIMIT" ] && {
                echo "$IPT_SAV" | grep -q "$i .*-j DROP" || {
                        echo -e "\n$i was dropped on $(date)\n" | mail -s "DROP by ${0##*/}: $i" $MAIL_TO
                        iptables -I INPUT -s $i -j DROP
                }
                egrep -q "^$i$" $PERM_LIST || echo $i >> $PERM_LIST
        }
done
--- 程式碼結尾 ---


測試 script 並存好, 並記下路逕, 如 /etc/firewall/block_ssh.sh

然後在 /etc/hosts.allow 寫入該路逕:
sshd: ALL: spawn ( /etc/firewall/block_ssh.sh )& : ALLOW

這樣, 那些亂 try SSH 的家夥, 頂多能試 5 次(LIMIT 可調整), 然後就給 BLOCK 掉了.

此外, 在 PERM_LIST 的 ip, 也可提供給 iptables 的初始 script , 來個永久性封閉:

--- 代碼: ---for i in $(< $PERM_LIST)
do
        /sbin/iptables -I INPUT -s $i -j DROP
done

--- 程式碼結尾 ---

導覽

[0] 文章列表

[#] 下頁

[*] 上頁

前往完整版本