SSH配置密钥登录
配置密钥登录一方面可以避免每次输入密码的麻烦(记住密钥文件密码的情况下),但最重要的一方面是增强安全性。
服务器上添加用户
1
|
useradd -g <group> -m <username>
|
设置密码
1
|
passwd <username>
|
本机生成密钥
1
|
ssh-keygen -t rsa -b 4096 -f ~/.ssh/123.57.121.21_ali_rsa
|
1 |
-t rsa 指定加密方式为RSA |
输入密钥文件密码
保证密钥文件的安全,尤其是无法保证自己电脑安全的情况下,不要为空
添加到服务器端相应帐号密钥中
1
|
ssh-copy-id -i ~/.ssh/123.57.121.21_ali_rsa.pub newnius@123.57.121.21 -p 22
|
1 |
-i ~/.ssh/123.57.121.21_ali_rsa.pub 指定密钥文件公钥,注意末尾的.pub,这是公钥文件,不要把私钥传上去了。。。 |
输入用户密码,添加完毕
用密钥登录,跟用密码方式命令一样
1
|
ssh newnius@123.57.121.21 -p 22
|
如果密钥文件设置了密码,会弹出输入框,输入密码即可,为了避免麻烦,选择了“记住”选项
ubuntu中,ssh会默认搜索~/.ssh/目录下的所有key文件,并在登录时首先使用该目录下的keyfile逐个尝试登录,如果该目录下keyfile过多(超过5个),可能造成所有ssh请求均无法登录问题(提示Too many authentication failures for username)。Ubuntu设置ssh密钥登录
两种密钥文件过多导致错误的解决方式:
登陆时指定密钥文件
1
|
ssh -i ~/.ssh/123.57.121.21_ali_rsa.pub newnius@123.57.121.21 -p 22
|
配置config文件(推荐)
1
|
vim ~/.ssh/config
|
如果没有该文件,新建就行
按照如下格式添加
1 |
Host <name> #别名 |
配置完毕之后,就可以使用
1
|
ssh <name>
|
命令直接登陆了,方便快捷
简单的安全设置(要以 root 权限运行)
1
|
vim /etc/ssh/ssh_config
|
修改相关条目,不存在的新建,前面的#号删除
禁止密码登录
有了密钥登录之后,密码登录就用不着了
PasswordAuthentication no
禁止root用户直接登录
PermitRootLogin no
修改端口
Port 12345
限制协议版本,取消支持低版本协议
Protocal 2
限制登录尝试次数
MaxAuthTries 3
详细:(http://www.freebsd.org/cgi/man.cgi?query=sshd_config&sektion=5&n=1
更强的安全设置参考IBM的文章
可能会遇到的问题
新建帐号登录后终端前面只有一个 “$” 符号,而不是user@host 形式。
原因:没有指定bash
解决方式:
a.输入bash
b.管理员用户编辑配置文件 /etc/passwd
找到该帐号所在行,在末尾添加/bin/bash
-----------------
ssh 密钥登录
如果一定要使用密码登录,请查考正文最后 fail2ban 与 DenyHosts 的介绍。
不要相信自己的密码,在暴力枚举面前,只是时间文件。
统计学告诉我们,请配置 RSA
有两种不同的密钥分发方式,但结果都是一样的。
在客户端生成公钥与私钥,上传公钥到服务器
在服务器生成公钥和私钥,复制私钥到客户端
我使用第二种方式进行演示:
服务器生成密钥
sudo ssh-keygen -b 2048 -t rsa
这样一来,在根目录就生成了一个.ssh的隐藏目录,内含两个密钥文件。
xxx 为私钥,需复制到客户端,xxx.pub 为公钥。
服务器配置公钥
cd ~/.ssh
sudo cat xxx.pub >> authorized_keys # 默认允许的 key 存储的文件
sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh
配置 ssh 文件
sudo vi /etc/ssh/sshd_config
#编辑以下内容
RSAAuthentication yes #RSA 认证
PubkeyAuthentication yes #开启公钥验证
AuthorizedKeysFile .ssh/authorized_keys #验证文件路径
复制私钥到本地,并且设置相应 ssh 工具的连接配置。
重启服务器:
service sshd restart
禁止密码登录
使用密钥登录成功之后,再设置此项。
sudo vi /etc/ssh/sshd_config
#编辑以下内容
PasswordAuthentication no #禁止密码认证
PermitEmptyPasswords no #禁止空密码
UsePAM no#禁用 PAM
iptables
iptables 是Linux上最强大的防火墙软件。
安装
yum install iptables -y
yum install iptables-services -y #CentOS7 需安装此 iptables 的 service 软件包#
# Debian/Ubuntu 执行:
apt-get install iptables -y
apt-get install iptables-persistent -y #持久化 iptables 规则服务#
CentOS 7 上默认安装了 firewalld 建议关闭并禁用:
systemctl stop firewalld
systemctl mask firewalld
清除已有 iptables 规则:
iptables -F
iptables -X
iptables -Z
开放指定端口:
# 允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问 22222(SSH)端口,以下几条相同,分别是 22222,80,443 端口的访问
iptables -A INPUT -p tcp --dport 22222 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许 FTP 服务的 21 和 20 端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#允许 ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
#禁止其他未允许的规则访问(注意:如果 22 端口未加入允许规则,SSH 链接会直接断开。)
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
#屏蔽单个 IP 的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从 123.0.0.1 到 123.255.255.254 的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封 IP 段即从 123.45.0.1 到 123.45.255.254 的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封 IP 段即从 123.45.6.1 到 123.45.6.254 的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
#屏蔽某 IP 访问指定端口,以 22 端口为例命令是
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j DROP
#允许某 IP 访问指定端口,以 22 端口为例命令是
iptables -I INPUT -p tcp --dport 22 -j DROP
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j ACCEPT
#
ACCEPT:允许通过.
LOG:记录日志信息,然后传给下一条规则继续匹配.
REJECT:拒绝通过,必要时会给出提示
DROP:直接丢弃,不给出任何回应.
PREROUTING:在进行路由选择前处理数据包
INPUT:处理入站的数据包
OUTPUT:处理出站的数据包
FORWARD:处理转发的数据包
POSTROUTING:在进行路由选择后处理数据包
保存防火墙规则:
service iptables save
设置防火墙开机启动:
chkconfig --level 345 iptables on
# CentOS7 可执行:
systemctl enable iptables
fail2ban
如已经设置 禁止密码登录,可忽悠。
通过使用 iptables 防火墙,将尝试爆破 ssh 密码的 IP 封停,默认 10 分钟。
安装
yum install -y fail2ban
配置:
cp -pf /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.local
[sshd]
enabled = trueport = 22222
logpath = %(sshd_log)s
backend = %(sshd_backend)s
filter = sshd
action = iptables[name=SSH, port=22222, protocol=tcp] sendmail-whois[name=SSH, dest=root, sender=fail2ban@example.com]
logpath = /var/log/secure
maxretry = 3
DenyHosts
如已经设置 禁止密码登录,可忽悠。
分析sshd的日志文件,当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏蔽IP的功能。
和 fail2ban 一样,都是防止暴力破解密码,两者任选其一即可。
安装
yum install denyhosts
配置
vi /etc/denyhosts.conf
# 配置相关说明
SECURE_LOG = /var/log/secure #ssh 日志文件,系统不同,文件不相同
HOSTS_DENY = /etc/hosts.deny #控制用户登陆的文件
PURGE_DENY = #过多久后清除已经禁止的,空表示永远不解禁
BLOCK_SERVICE = sshd #禁止的服务名,如还要添加其他服务,只需添加逗号跟上相应的服务即可
DENY_THRESHOLD_INVALID = 5 #允许无效用户失败的次数
DENY_THRESHOLD_VALID = 10 #允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 1 #允许 root 登陆失败的次数
DENY_THRESHOLD_RESTRICTED = 1
WORK_DIR = /var/lib/denyhosts #运行目录
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
HOSTNAME_LOOKUP=YES #是否进行域名反解析
LOCK_FILE = /var/run/denyhosts.pid #程序的进程 ID
ADMIN_EMAIL = root@localhost #管理员邮件地址,它会给管理员发邮件
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_FROM = DenyHosts <nobody@localhost>
SMTP_SUBJECT = DenyHosts Report
AGE_RESET_VALID=5d #用户的登录失败计数会在多久以后重置为 0,(h 表示小时,d 表示天,m 表示月,w 表示周,y 表示年)
AGE_RESET_ROOT=25d
AGE_RESET_RESTRICTED=25d
AGE_RESET_INVALID=10d
RESET_ON_SUCCESS = yes #如果一个 ip 登陆成功后,失败的登陆计数是否重置为 0
DAEMON_LOG = /var/log/denyhosts #自己的日志文件
DAEMON_SLEEP = 30s #当以后台方式运行时,每读一次日志文件的时间间隔。
启动
/etc/init.d/daemon-control start #启动 denyhosts
chkconfig daemon-control on #将 denghosts 设成开机启动
启动命令(yum 安装,已默认配好)
service denyhosts start
service denyhosts stop
service denyhosts status