SSH的一些安全小技巧
一, 前言
關(guān)于 ssh 的好處, 相信不用我多說(shuō)了吧?
簡(jiǎn)而言之, 之前的 rpc command 與 telnet 都全可用 ssh 代替.
比方如下的這些常見(jiàn)功能:
- 遠(yuǎn)程登錄
ssh user@remote.machine
- 遠(yuǎn)程執(zhí)行
ssh user@remote.machine 'command ...'
- 遠(yuǎn)程復(fù)制
scp user@remote.machine:/remote/path /local/path
scp /local/path user@remote.machine:/remote/path
- X forward
ssh -X user@remote.machine
xcommand ...
- Tunnel / Portforward
ssh -L 1234:remote.machine:4321 user@remote.machine
ssh -R 1234:local.machine:4321 user@remote.machine
ssh -L 1234:other.machine:4321 user@remote.machine
至于詳細(xì)的用法, 我這就不說(shuō)了. 請(qǐng)讀者自行研究吧.
我這里要說(shuō)的, 是針對(duì) ssh 服務(wù)為大家介紹一些安全技巧, 希望大家用得更安心些.
二, 實(shí)作
(實(shí)作以 RedHat 9 為范例)
1) 禁止 root 登錄
# vi /etc/ssh/sshd_config
PermitRootLogin no
2) 廢除密碼登錄, 強(qiáng)迫使用 RSA 驗(yàn)證(假設(shè) ssh 賬戶為 user1 )
# vi /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
# service sshd restart
# su - user1
$ mkdir ~/.ssh 2>/dev/null
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
--------------------------------------------------
轉(zhuǎn)往 client 端:
$ ssh-keygen -t rsa
(按三下 enter 完成﹔不需設(shè)密碼,除非您會(huì)用 ssh-agent 。)
$ scp ~/.ssh/id_rsa.pub user1@server.machine:id_rsa.pub
(若是 windows client, 可用 puttygen.exe 產(chǎn)生 public key,
然后復(fù)制到 server 端后修改之, 使其內(nèi)容成為單一一行.)
---------------------------------------------------
回到 server 端:
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub
$ exit
3) 限制 su / sudo 名單:
# vi /etc/pam.d/su
auth required /lib/security/$ISA/pam_wheel.so use_uid
# visudo
%wheel ALL=(ALL) ALL
# gpasswd -a user1 wheel
4) 限制 ssh 使用者名單
# vi /etc/pam.d/sshd
auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users onerr=fail
# echo user1 >> /etc/ssh_users
#p#
5) 封鎖 ssh 聯(lián)機(jī)并改用 web 控管清單
# iptables -I INPUT -p tcp --dport 22 -j DROP
# mkdir /var/www/html/ssh_open
# cat > /var/www/html/ssh_open/.htaccess <
AuthName "ssh_open"
AuthUserFile /var/www/html/ssh_open/.htpasswd
AuthType basic
require valid-user
END
# htpasswd -c /var/www/html/ssh_open/.htpasswd user1
(***還將 SSL 設(shè)起來(lái), 或只限 https 聯(lián)機(jī)更佳, 我這里略過(guò) SSL 設(shè)定, 請(qǐng)讀者自補(bǔ).)
(如需控制聯(lián)機(jī)來(lái)源, 那請(qǐng)?jiān)傺a(bǔ) Allow/Deny 項(xiàng)目, 也請(qǐng)讀者自補(bǔ).)
# cat > /var/www/html/ssh_open/ssh_open.php <
//Set dir path for ip list
$dir_path=".";
//Set filename for ip list
$ip_list="ssh_open.txt";
//Get client ip
$user_ip=$_SERVER['REMOTE_ADDR'];
//allow specifying ip if needed
if (@$_GET['myip']) {
$user_ip=$_GET['myip'];
}
//checking IP format
if ($user_ip==long2ip(ip2long($user_ip))) {
//Put client ip to a file
if(@!($file = fopen("$dir_path/$ip_list","w+")))
{
echo "Permission denied!!";
echo "Pls Check your rights to dir $dir_path or file $ip_list";
}
else
{
fputs($file,"$user_ip");
fclose($file);
echo "client ip($user_ip) has put into $dir_path/$ip_list";
}
} else {
echo "Invalid IP format!!ssh_open.txt was not changed.";
}
?>
END
# touch /var/www/html/ssh_open/ssh_open.txt
# chmod 640 /var/www/html/ssh_open/*
# chgrp apache /var/www/html/ssh_open/*
# chmod g+w /var/www/html/ssh_open/ssh_open.txt
# chmod o+t /var/www/html/ssh_open
# service httpd restart
# mkdir /etc/iptables
# cat > /etc/iptables/sshopen.sh <
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
list_dir=/var/www/html/ssh_open
list_file=$list_dir/ssh_open.txt
chain_name=ssh_rules
mail_to=root
# clear chain if exits, or create chain.
iptables -L -n | /bin/grep -q "^Chain $chain_name" && {
iptables -F $chain_name
true
} || {
iptables -N $chain_name
iptables -I INPUT -p tcp --dport 22 -j $chain_name
}
# clear chain when needed
[ "$1" = clear ] && {
iptables -F $chain_name
exit 0
}