前言:
整理下很久之前做异地备份、数据同步都有使用到的ssh免密码通过密钥登陆的步骤。
出于安全考虑,需要对ssh服务做下简单配置
说明:
服务端:既服务器(或异地保存数据的目的机),或理解为IP通信中的目的地址
客户端:既工作站,个人电脑(或数据源服务器),或理解为IP通信中的源地址
思路:
要做的有几个地方:
默认服务端口修改(可以避免部分针对22端口的暴力破解或扫描)
ssh版本协议(这个现在基本默认就是版本2)
禁止root账户ssh登陆
自定义登陆消息(可以给非本人的登陆行为一个友好提醒)
只允许指定ip登入
密钥认证登陆
普通账户的sudo权限
iptables 规则修改
重启服务,验证修改是否生效
正文:
1.ssh服务配置(主要配置服务端,如是双向登陆则都需要配置)
linux ssh服务的配置文件为/etc/ssh/sshd_config,对此文件修改以下几个地方,本文给出修改后的参数及说明
Port 2020 #修改ssh服务端口为2020 Protocol 2 #只允许SSH2协议链接 ServerKeyBits 1024 #serverkey强度为1024 PermitRootLogin no #禁止root账户ssh登陆 PermitEmptyPasswords no #禁止空密码登陆 PasswordAuthentication no #禁止密码方式登陆 Banner /etc/ssh/ssh_banner.txt #自定义登陆前欢迎语的具体文件(文件内容为登陆前欢迎消息)
以上某些参数在大部分系统中已默认为以上值,如serverkeybit
2.自定义登陆提示信息
账户登陆前的提示信息设置已经在上面做了设置,接下来做下账户登陆成功后的提示信息,将提示内容写入如下文件即可
/etc/motd
3.只允许指定IP登陆
配置这个一般都是在你有固定公网IP的情况下才做的,或者你有一个可以连接到服务器内网的***,否则不要轻易设置这个,设置后很可能会无法登陆
这里我们使用hosts.allow和hosts.deny两个文件进行控制,这两个文件为TCP wrappers规则文件既ACL,有兴趣的朋友可自行了解下
简单说下安全规则,ssh登陆时,主机会先检测hosts.deny文件中是否有拒绝列表,然后在检测hosts.allow中是否有允许列表。有关ACL访问控制列表的详情,请自行了解。
这里有两种用法,一种是将已确认的危险IP加入到hosts.deny文件中,另一种是直接带hosts.deny文件中拒绝所有,然后将允许的IP加入到hosts.allow中,这里我们采用后一种方式
编辑hosts.deny hosts.allow文件,在最后一行加入 如下内容,格式为[,]逗号是分割多个ip,而[:]冒号是分割它的处理,处理方式只能为allow或deny,分割方式可省略
vim /etc/hosts.deny sshd:All #下载deny文件中就是默认拒绝所有
vim /etc/hosts.allow sshd:118.144.133.66 #允许指定单一IP地址 sshd:192.168.1.2/24 #允许指定单一IP地址 sshd:192.168.2. #允许指定IP地址段
4.密钥认证
这个密钥是要在客户端,既个人电脑工作站上生成,密钥分为私钥与公钥,私钥是保存在自己客户端上的,而公钥是发送给服务端保存在服务端上的
生成密钥,密钥分为rsa与dsa,在算法上有所区别,具体有待理解。
执行以下命令,一路回车,切记不要输入密码,不然就达不到免密码登陆的效果了,当然如果是使用密钥验证的登陆方式,可以设置密码,这样在登陆时除了需要密钥,还需要正确密码才可登陆成功
ssh-keygen -t rsa
将生成的id_rsa.pub公钥文件传送到服务端,另存为authorized_keys,并赋予755权限,切记,此文件一定要保存到登陆用户的~/.ssh目录下。如我是以om用户登陆,我保存的文件就是/home/om/.ssh/authorized_keys。
如服务端已有此文件,则注意文件内容是否为自方人员公钥信息,若是则将自己的公钥追加到文件内,可使用以下命令。若不是自方人员信息,就要排查服务器了
cat id_rsa.pub >> /home/om/.ssh/authorized_keys
注:最后要确认.ssh目录的权限为700;authorized_keys的权限为600,同时.ssh目录和authorized_keys的属主(own) 属组(group)都为用户本身 。如果这两个权限有一个不正确,虽设置了密钥登陆,但还是会提示输入密码的
ll -ldZ
drwx------. root root unconfined_u:object_r:ssh_home_t:s0 .ssh/
5.为普通用户赋予sudo权限
控制sudo权限的文件为/etc/sudoers,默认为只读文件,即使是root账号
首先修改sudoers用户权限,使root账号拥有写权限
chmod u+w /etc/sudoers
找到如下一行,按相同格式增加一行
最后去掉写权限
chmod u-w /etc/sudoers
这里使用了简单粗暴的配置方式,有关sudoers文件的详细说明,带我研究后再写篇^_^
6.增加iptables规则
将修改后的ssh端口号加入到iptables内,以防止因iptables为允许端口通信导致的无法链接
7.重启服务
重启ssh及iptables服务
service sshd restart service iptables restart
每次修改ssh配置文件,都需要重启服务才会生效
8.验证
不要急着退出当前登陆窗口,重新开启一个命令行窗口,进行登陆测试,因为如果登陆失败,还有修改的机会,若要已经退出原有登陆窗口,那就悲剧了……
2015-10-14:增加ssh密钥登陆时需注意权限
2016-11-29:注意.ssh 目录的安全标签,若.ssh目录不是通过ssh-keygen创建的,那目录安全标签就应该不是ssh_home_t:s0 值,这时若SElinux 为启用状态,即使公钥登录配置的正确,仍会提示输入密码认证
恢复目录安全标签
restorecon -r -vv .ssh
2018-04-17:更正ssh目录及文件权限