远程协议
- telnet,默认端口23,传输无加密
- 通常被当成检测TCP端口存活使用,生产环境不建议使用
- ssh,默认端口22,传输基于加密
- 默认使用远程方式
SSH
SSH(Secure Shell)安全shell缩写,可以基于RSA非对称加密和HA密钥交换算法实现加密传输。
- 有两个不兼容的版本分别是:1.x和2.x
- SSH1采用对称加密算法保护数据安全传输(最终2边秘钥相同),而对称加密算法的密钥是通过非对称加密算法(RSA,2边不同,需要通过秘钥进行解密,防止秘钥被窃听)来完成交换的。SSH1使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。
- SSH2避免了RSA的专利问题,并修补了CRC的缺陷。SSH2用数字签名算法(DSA)和Diffie-Hellman(DH)算法代替RSA来完成对称密钥的交换,用消息证实代码(HMAC)来代替CRC。
- RSA基于公钥的方式,DH基于签名证书方式
OpenSSH 7.0及以上版本默认禁用了ssh-dss(DSA)公钥算法,官方建议不要使用,但是可以开启
http://www.openssh.com/legacy.html
openssh
OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。
- 兼容1.x和2.x,默认开启2.x和RSA秘钥
- 守护进程:sshd
- /etc/ssh/sshd_config 配置文件
- $home/.ssh 秘钥路径
- openssl是传输加密协议(https、sftp等)
秘钥文件
- id_rsa 私钥文件进行解密使用(服务保留)
- id_rsa.pub 公钥文件进行加密使用(对外使用)
- 反之就是私钥加密,公钥解密
- known_hosts 记录访问者的key,当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
- authorized_keys(授权)
- 加入别人的公钥为了让两个linux机器之间使用ssh不需要用户名和密码
- 加入自己的公钥为了其他用户ssh远程使用key登入
配置文件(常见使用)
Port 22 #默认端口,一般建议修改
PermitRootLogin yes #默认开启,开启root用户登入,安全考虑关闭,使用普通用户登入进行su切换
StrictModes yes #接受连接请求前对用户家目录和rhosts文件的权限和所有权检查,预防可能出现的低级错误
MaxAuthTries 6 #最大允许认证次数
MaxSessions 10 #每个网络允许打开会话的最大数量
PubkeyAuthentication yes #启用公钥认证,SSH二代通讯协议
AuthorizedKeysFile .ssh/authorized_keys #指定公钥库位置
PermitEmptyPasswords yes #不允许空密码用户登录
PasswordAuthentication yes #启用密码验证
UseDNS no #禁用反向解析,加快ssh的连接
以下为说明
RSAAuthentication yes #SSH一代通讯协议(7.4版本后已经弃用)
#配置自然也就没有了,所有不用加上这个配置,只要开启PubkeyAuthentication即可
服务器之间免密登入
A服务器:192.168.26.133
B服务器:192.168.26.137
A服务器操作(B服务器同样操作)
ssh-keygen -t rsa -b 4096
#官网建议秘钥长度为4096
#过程全部回车,不要设置key密码
ssh-copy-id -i id_rsa.pub root@192.168.26.137
#直接复制本地的公钥到B服务器上,B服务器会自动创建authorized_keys文件
权限设置
chmod go-w $HOME $HOME/.ssh
chmod 600 $HOME/.ssh/authorized_keys
chown `whoami` $HOME/.ssh/authorized_keys
#如果StrictModes为yes必需保证存放公钥的文件夹的拥有与登陆用户名是相同的
#另一个方案就是StrictModes为no,但是不建议
配置文件
vi /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
systemctl restart sshd
PasswordAuthentication yes
#服务器之间免密登入跟PasswordAuthentication没有关系,只要加入授权authorized_keys
参考权限设置:http://doc.okbase.net/onionsheep/archive/103053.html
配置SSH远程基于公钥
ssh-keygen -t rsa -b 4096
#官网建议秘钥长度为4096
#密码看需求配置,如果配置了服务器免密,就不要密码
touch authorized_keys
cat id_rsa.pub >> authorized_keys
#追加自己的公钥加入授权文件里,不然key无效
权限设置
chmod go-w $HOME $HOME/.ssh
chmod 600 $HOME/.ssh/authorized_keys
chown `whoami` $HOME/.ssh/authorized_keys
配置文件
vi /etc/ssh/sshd_config
PasswordAuthentication no
#关闭密码认证,不然就或的关系,密钥和密码只要认证一个就能登入
AuthenticationMethods publickey,password
#可以设置密码和密码同时需要认证,与关系
将私钥id_rsa拷贝到远程客户端
systemctl restart sshd
总结
会发现服务器之间SSH和本地远程客户端之间SSH对于key有点区别
服务器之间SSH,authorized_keys存放的是别人的公钥key
本地远程客户端之间SSH,authorized_keys存放的是自己的公钥key