(最終更新日時:2008-12-28 20:57:07)
ネットワークによるリモートシェル操作は、SSH(Secure Shell)でのみ行うため、SSHサーバー OpenSSH の設定を行います。
なお、SSHによる接続認証は、公開鍵方式のみとし、パスワード認証は禁止しています。
設定
定義ファイルを編集します。
# vi /etc/ssh/sshd_config
:
#ListenAddress 0.0.0.0
ListenAddress 0.0.0.0 IP-V4のみ有効にしています
#ListenAddress ::
:
#PermitRootLogin yes
PermitRootLogin no rootによるログインを禁止します
:
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no パスワード認証を行いません
:
#PermitTunnel no
AllowGroups 接続を許可するgroup 必要に応じて追加します
AllowUsers 接続を許可するuser 必要に応じて追加します
# no default banner path
:
不正接続ログ対策
辞書攻撃によるアタックで不正接続が大量にログに記録されますので、
iptables
で接続そのものを一定時間拒否するようにします。
情報元は、
http://search.luky.org/linux-users.a/msg04927.html
で進戸氏が紹介されている方法です。
ホワイトリストをIPアドレスで指定し、前方一致で判断するように変更するとともに、ホワイトリスト存在時の動作を修正しています。
また、メールによる通知も行わないようにしています。
# vi /usr/local/sbin/block_ssh_attack.sh
#!/bin/sh
#
# SSH接続に失敗したIPを一定時間拒否する
# 引数 : arg1 ... IPアドレス (tcpdより取得)
# arg2 ... 拒否時間 (分)
#
# Orignal Script : http://search.luky.org/linux-users.a/msg04927.html (Kentaro Shinto)
#
# 2007/10/03 System House ACT T.Yamaguchi
NUMLOGBACK=30
LOGFILE=/var/log/secure
SSHPORT=22
WHITEIPLISTS="192.168.2" # 内部LANのIPアドレスを前方一致で指定しています
IPADDR=$1
SUSPENDMIN=$2
# White List に登録されているかのチェック関数
whitelist()
{
for WHITEIP in $WHITEIPLISTS; do
[ "$WHITEIP" = $(expr substr "$IPADDR" 1 $(expr length "$WHITEIP")) ] && return 0
done
return 1
}
# 接続に失敗したIPかをチェックする
tail -$NUMLOGBACK $LOGFILE | \
egrep -i "sshd.*((Invalid user [-a-zA-Z0-9\.]+|Did not receive identification string|Received disconnect) from $IPADDR|User [-a-zA-Z0-9\.]+ from $IPADDR not allowed|Address $IPADDR .*- POSSIBLE BREAKIN ATTEMPT!$)" \
> /dev/null && MATCH=TRUE
# 接続に失敗していても、White List に存在すれば失敗とみなさない
[ x$MATCH = xTRUE ] && whitelist && exit 0
if [ x$MATCH = xTRUE ]; then
iptables -L -n | grep "REJECT.*$IPADDR" > /dev/null
if [ $? != 0 ]; then
EXPIRE=$(date '+%R' -d "$SUSPENDMIN min")
iptables -I INPUT -s $IPADDR -p tcp --dport $SSHPORT -j REJECT
echo "iptables -D INPUT -s $IPADDR -p tcp --dport $SSHPORT -j REJECT" | at "$EXPIRE" > /dev/null
logger -p authpriv.info -t SSHBLOCK "Blocking IP $IPADDR for $EXPIRE"
fi
fi
SSH接続の際に、上記スクリプトで接続許可判定を行うようにします。
# vi /etc/hosts.allow
:
# allowed to use the local INET services, as decided
# by the '/usr/sbin/tcpd' server.
#
sshd : ALL : spawn ( /usr/local/sbin/block_ssh_attack.sh %c 5 ) : allow
起動
ファイアーウォール
iptables の設定を追加します。
# vi /usr/local/sbin/firewall.sh
:
# --- (INPUTチェイン) ---
:
# SSH接続を許可
iptables -A INPUT -i $EXTIF -p tcp --dport 22 -j CHK-SYNFLOOD
:
# --- (OUTPUTチェイン) ---
:
# SSH接続を許可
iptables -A OUTPUT -o $EXTIF -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
:
# firewall.sh 設定を反映させます
sshdを起動します。
# chkconfig sshd on
# service sshd start
鍵セットの作成
SSH接続を許可するユーザの鍵セットを作成します。
# su - user1
$ ssh-keygen -b 1024 -t dsa -C "SSH Connection User : user1"
Generating public/private dsa key pair.
Enter file in which to save the key (/home/users/user1/.ssh/id_dsa): [Enter]
Created directory '/home/users/user1/.ssh'.
Enter passphrase (empty for no passphrase): パスフレーズ
Enter same passphrase again: パスフレーズ再入力
:
$ cd .ssh
$ cat id_dsa.pub >> authorized_keys
$ rm id_dsa.pub
$ exit
(※ /home/users/user1/.ssh/id_dsa を user1 へ パスフレーズ と共に配布します)
# rm /home/users/user1/.ssh/id_dsa 配布後、削除します
Copyright © 2004-2009 System House ACT. All Rights Reserved.