前言:

    整理下很久之前做异地备份、数据同步都有使用到的ssh免密码通过密钥登陆的步骤。

    出于安全考虑,需要对ssh服务做下简单配置


说明:

    服务端:既服务器(或异地保存数据的目的机),或理解为IP通信中的目的地址

    客户端:既工作站,个人电脑(或数据源服务器),或理解为IP通信中的源地址


思路:

    要做的有几个地方:

  1. 默认服务端口修改(可以避免部分针对22端口的暴力破解或扫描)

  2. ssh版本协议(这个现在基本默认就是版本2)

  3. 禁止root账户ssh登陆

  4. 自定义登陆消息(可以给非本人的登陆行为一个友好提醒)

  5. 只允许指定ip登入

  6. 密钥认证登陆

  7. 普通账户的sudo权限

  8. iptables 规则修改

  9. 重启服务,验证修改是否生效


正文:

    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

wKiom1YbaXzgMiw6AADdKeS5D_4536.jpg

    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)都为用户本身 。如果这两个权限有一个不正确,虽设置了密钥登陆,但还是会提示输入密码的

wKiom1YdzS6xS-L-AADEpGVY7Y4898.jpg

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

    找到如下一行,按相同格式增加一行

wKioL1Ybczuh5cr3AAA3zmapvtw264.jpg

    最后去掉写权限

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目录及文件权限