免密登录Linux主机

2018-07-30 宋洋葱 宋洋葱

安装 sshd

yum install -y openssl openssh-server

vi /etc/ssh/sshd_config
Port 22
PermitRootLogin yes

启动ssh服务
systemctl start sshd.service

重启网络
service network restart

设置开机启动ssh服务
systemctl enable sshd.service

每次在终端使用ssh链接服务器,需要输入账号、密码、端口、域名等一大堆东西,比较繁琐。若不想输入密码端口等信息,可以使用 ssh 密钥方式连接服务器。

假设Linux服务器的ip为:192.168.1.2,ssh端口:3322,以下以mac操作为例。

四种不同的密钥加密算法

文件名算法类型说明与推荐度
~/.ssh/id_rsaRSA最经典、兼容性最好。但安全性依赖密钥长度(建议≥3072位),且密钥生成和签名速度较慢。仍可用,但已非首选
~/.ssh/id_dsaDSA老旧算法,已被 OpenSSH 7.0+ 默认禁用(因固定 1024 位不安全)。不建议使用,仅出现在历史遗留系统中。
~/.ssh/id_ecdsaECDSA基于椭圆曲线,速度比 RSA 快,密钥更短。安全性依赖于所选曲线和系统随机数质量。可用,但部分发行版/硬件支持略逊于 Ed25519
~/.ssh/id_ed25519Ed25519现代、安全、高性能的椭圆曲线算法。密钥极小,签名/验证极快。目前最佳推荐,所有主流系统均已支持。

核心差异总结

  • 安全性排名(高到低):Ed25519RSA(4096位) > ECDSA > RSA(2048位)DSA
  • 兼容性RSA 兼容最广(老旧设备),Ed25519 在 2014 年后的系统普遍支持。
  • 使用建议优先生成 ed25519 密钥,若目标服务器极旧(如 RHEL 6)可备选 rsa

与免密登录的关联

  • 这些 .ssh/id_xxx 文件是私钥(需严格保密,权限 600),对应的 .pub 文件是公钥(需放到服务器 authorized_keys)。

生成公钥和私钥

使用ssh-keygen生成密钥:ssh-keygen -f ~/.ssh/id_rsa_sxy

可以使用 -C 添加注释,如: ssh-keygen -f ~/.ssh/id_rsa_sxy -C "sxy21cn@qq.com"

ssh-keygen -t ed25519 -C "你的备注(如邮箱)"

默认保存位置:/.ssh/id_ed25519(私钥)、/.ssh/id_ed25519.pub(公钥)

按提示可设置密钥密码(passphrase),若不想每次使用都输入则留空直接回车。

如果客户端系统较老不支持 ed25519,可用 -t rsa -b 4096 代替。

把公钥复制到需要登录的主机

ssh-copy-id 用户名@服务器IP
# 或者指定端口和公钥文件
# ssh-copy-id -p 3322 -i ~/.ssh/id_rsa_sxy.pub  songxueyan@192.168.1.2

方法二:把公钥内容复制到服务器 ~/.ssh/authorized_keys

查看客户端公钥内容:cat ~/.ssh/id_ed25519.pub

SSH 登录服务器后,将内容追加到目标用户的 ~/.ssh/authorized_keys 文件中:

mkdir -p ~/.ssh
echo "粘贴公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

验证登录

成功以后即可私钥链接服务器(服务器用公钥验证),使用 -i 参数指定密钥文件。

ssh -i ~/.ssh/id_rsa_sxy -p 3322  songxueyan@192.168.1.2

如果密钥名称是 id_rsa 则不需要 -i 参数

若是从别的地方下载或者拷贝的密钥,链接时可能出现错误:

Permissions 0644 for '/Users/songyangcong/.ssh/id_rsa_sxy' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/songyangcong/.ssh/id_rsa_sxy": bad permissions
songxueyan@192.168.1.2: Permission denied (publickey).

意思是权限太大了,私钥只能创建者有读写权限,其他人不可读写。改一下权限即可。

chmod og-rw ~/.ssh/id_rsa_sxy.pub

配置 config

虽然少了账号密码,但需要指定端口和密钥,能不能一块去掉呢。

先编辑host sudo vim /etc/hosts

绑定一个域名如下: 192.168.1.2 www.sxy91.com sxy91

测试:ping sxy91

然后编辑ssh的config文件:vim ~/.ssh/config,内容如下:

Host sxy91
    HostName www.sxy91.com
    User songxueyan
    Port 3322
    IdentityFile ~/.ssh/id_rsa_sxy

此时,无须输入端口和密码即可连接成功

ssh sxy91

遇到的问题

还需要密码

确保服务器 SSH 配置允许密钥认证 在服务器上检查配置文件 /etc/ssh/sshd_config

sudo nano /etc/ssh/sshd_config

确认以下配置项(去掉注释 # 并设置为 yes):

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes   # 暂时保留密码登录,测试成功后再改为 no 加强安全

修改后重启 SSH 服务:

sudo systemctl restart sshd

常见问题排查

现象可能原因解决方式
仍然提示密码服务器 ~/.sshauthorized_keys 权限过松服务器执行:chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
Permission denied (publickey)服务器未启用公钥认证检查 sshd_config 中的 PubkeyAuthentication
公钥已添加但无效公钥内容复制时换行错误确保一行完整,无多余空格换行
客户端私钥权限错误客户端 ~/.ssh/id_ed25519 权限应为 600执行 chmod 600 ~/.ssh/id_ed25519

若仍需输入密码,一般为权限问题。

服务器权限问题

# 用密码登录服务器查看 ~/.ssh 目录下文件的权限
ls -lh ~/.ssh
如果不是“ -rw-------” 那么权限不正确 
# 需要把权限改成仅自己可读写
chmod -R og-wxr ~/.ssh
chmod u-x ~/.ssh/authorized_keys

说明:安全起见,sshd强制对key的文件权限进行检查,authorized_keys文件所在的目录(包括上层目录)的权限只有自己能读写,他人和组只能读。

若还有问题,调试过程如下:

ssh -vT sxy91 # 打印调试信息,查看Next authentication method: publickey 以后的行。
#发现有Offering public key,但没有Server accepts key

# 查看sshd日志
tail -f /var/log/secure
# 发现一行Authentication refused: bad ownership or modes for file ~/.ssh/authorized_keys

客户端权限问题 说明:私钥仅能自己读写。公钥其他人只能读。 若权限不正确,git或者ssh会出现id_rsa are too open错误如下:

Permissions 0644 for  are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.

修改客户端的私钥公钥权限

chmod -R og-wxr ~/.ssh
chmod -R og+r ~/.ssh/*.pub
chmod -R og+r ~/.ssh/config
chmod -R og+r ~/.ssh/known_hosts

再次测试问题解决

ssh奇技淫巧

1、ssh端口转发(隧道)

#本机访问server端8080端口如下(s端防火墙只允许localhost访问):
ssh -L 8080:localhost:8080 sxy@server

2、访问server的多个绑定localhost的端口

ssh sxy@server -L 8080:localhost:8080 -L 8088:localhost:8088

3、免密转发ssh_config

# 把转发规则配置到 ~/.ssh/config

Host tunnel
    HostName database.example.com
    IdentityFile ~/.ssh/coolio.example.key
    User sxy91
    LocalForward 9906 127.0.0.1:3306
    LocalForward 8806 127.0.0.1:8806

alpline 错误

如果遇到错误: channel 3: open failed: administratively prohibited: open failed

查看 sshd 配置项:

sshd -T | grep -Ei 'TCPKeepAlive|AllowTcpForwarding|PermitOpen'

# print
tcpkeepalive yes
allowtcpforwarding yes
permitopen any

修改为正确的配置:

vi /etc/ssh/sshd_config
rc-service sshd restart

参考