如何在 Linux / Unix 系统上设置 SSH 密钥
本页介绍了公钥,并向您展示了如何在 Linux 或类 Unix 服务器上设置 SSH 密钥。我假设您正在使用 Linux 或类 Unix 服务器和客户端,并安装以下软件:
- OpenSSH SSHD 服务器
- Linux 上的 OpenSSH ssh 客户端和朋友(Ubuntu、Debian、{Free,Open,Net}BSD、RHEL、CentOS、MacOS/OSX、AIX、HP-UX 等)。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | 终端/ssh |
先决条件 | OpenSSH 客户端和服务器 |
操作系统兼容性 | *BSD • Linux • macOS • Unix • WSL |
预计阅读时间 | 6 分钟 |
什么是公钥认证?
OpenSSH 服务器支持多种身份验证方案。最流行的两种如下:
- 基于密码的身份验证
- 基于公钥的身份验证。这是使用密码的替代安全方法。建议在 VPS、云、专用服务器甚至家庭服务器上使用此方法。
如何设置 SSH 密钥
设置安全 ssh 密钥的步骤:
- 使用命令创建 ssh 密钥对ssh-keygen。
- ssh-copy-id在 Linux 或 Unix 服务器上使用命令复制并安装公共 ssh 密钥。
- 将自己添加到 sudo 或 wheel 组管理员帐户。
- 禁用root账户的密码登录。
- ssh user@server-name使用命令测试您的无密码 ssh 密钥登录。
让我们详细了解所有步骤。
如何设置公钥认证?
您必须生成公钥和私钥对。例如:
图 01:我们的示例设置
- server1.example.com – 您将公钥存储在远程主机上,并且您在这个基于 Linux/Unix 的服务器上拥有一个帐户。
- client1.example.com – 您的私钥保留在您用于连接 server1.example.com 服务器的台式机/笔记本电脑/计算机(或本地服务器)上。请勿与任何人共享或提供您的私人文件。
使用基于公钥的方法,您可以登录远程主机和服务器,并向其传输文件,而无需使用您的帐户密码。请随意用您的实际设置替换 server1.example.com 和 client1.example.com 名称。说得够多了,让我们设置公钥身份验证。如果 .ssh 目录不存在,请打开终端并输入以下命令:
mkdir -p $HOME/.ssh chmod 0700 $HOME/.ssh
1:创建密钥对
在计算机上(例如 client1.example.com),为协议生成密钥对。
ssh-keygen -t rsa
示例输出:
Generating public/private rsa key pair. Enter file in which to save the key (/Users/vivek/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/vivek/.ssh/id_rsa. Your public key has been saved in /Users/vivek/.ssh/id_rsa.pub. The key fingerprint is: 80:5f:25:7c:f4:90:aa:e1:f4:a0:01:43:4e:e8:bc:f5 vivek@desktop01 The key's randomart image is: +--[ RSA 2048]----+ | oo ...+. | |.oo . .ooo | |o .o. . .o . | | o ...+o. | | o .=.=S | | . .Eo . | | | | | | | +-----------------+
您需要设置密钥对的位置和名称。如果您还没有其他密钥,我建议您使用默认位置,例如:$HOME/.ssh/id_rsa。系统将提示您为您的私钥提供密码。我建议您在提示时设置密码。您应该在 $HOME/.ssh/ 目录中看到两个新文件:
- $HOME/.ssh/id_rsa– 包含您的私钥。
- $HOME/.ssh/id_rsa.pub– 包含您的公钥。
高级用户的可选语法
以下语法指定要创建的 RSA 密钥的位数为 4096(默认值为 2048):
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/vps-cloud.web-server.key -C "My web-server key"
其中,
- -t rsa:指定要创建的密钥类型。可能的值为“rsa1”(表示协议版本 1)和“dsa”、“ecdsa”、“ed25519”或“rsa”(表示协议版本 2)。
- -b 4096:指定要创建的密钥的位数
- -f ~/.ssh/vps-cloud.web-server.key:指定密钥文件的文件名。
- -C "My web-server key":设置新评论。
2:在远程服务器安装公钥
使用 scp 或 ssh-copy-id 命令将您的公钥文件(例如 $HOME/.ssh/id_rsa.pub)复制到远程服务器/主机上的帐户(例如 example@server1.example.com)。为此,请在您的 client1.example.com 上输入以下命令:
ssh-copy-id -i $HOME/.ssh/id_rsa.pub user@server1.example.com
或者只需将远程服务器中的公钥作为 authorized_keys 复制到 ~/.ssh/ 目录中:
scp $HOME/.ssh/id_rsa.pub user@server1.example.com:~/.ssh/authorized_keys
关于在远程服务器中附加公钥的注意事项
在某些系统上ssh-copy-id可能未安装命令,因此使用以下命令(提示时提供名为 vivek 的远程用户帐户的密码)来安装并附加公钥:
## First create .ssh directory on server ## ssh vivek@server1.example.com "umask 077; test -d .ssh || mkdir .ssh" ## cat local id.rsa.pub file and pipe over ssh to append the public key in remote server ## cat $HOME/.ssh/id_rsa.pub | ssh vivek@server1.example.com "cat >> .ssh/authorized_keys"
3:测试(在client1.example.com上输入命令)
ssh 命令的语法如下:
ssh user@server1.example.com ssh user@your-server-ip-address ssh -i ~/.ssh/your-key user@your-server-ip-address
或者复制一个名为 foo.txt 的文本文件:
scp foo.txt user@server1.example.com:/tmp/
系统将提示您输入密码。要摆脱每次登录远程主机时都需要输入的密码,请尝试 ssh-agent 和 ssh-add 命令。
什么是 ssh-agent 和 ssh-add,如何使用它们?
要删除当前会话的密码,请将密码添加到 ssh-agent,这样在使用 ssh 或 scp/sftp/rsync 使用公钥连接到主机时,系统将不再提示您输入密码。语法如下:
eval $(ssh-agent)
键入ssh-add命令以提示用户输入私钥密码并将其添加到 ssh-agent 命令维护的列表中:
ssh-add
输入您的私钥密码。现在再次尝试登录 user@server1.example.com,系统不会提示您输入密码:
ssh user@server1.example.com
可以使用该选项列出所有身份的公钥参数-L:可以使用以下命令
$ ssh-add -L
从 ssh-agent 中删除所有私钥:
注销时杀死 ssh 代理,运行:
您还可以将如下内容添加到 shell 启动中,以在注销时杀死 ssh-agent:-D
$ ssh-add -D
kill $SSH_AGENT_PID
$ trap "kill $SSH_AGENT_PID" 0
4:禁用服务器上基于密码的登录
登录到您的服务器,输入:
使用文本编辑器(例如 nano 或 vim)在 server1.example.com 上编辑 /etc/ssh/sshd_config:
## client commands ##
$ eval $(ssh-agent)
$ ssh-add
$ ssh user@server1.example.com
警告:请确保将自己添加到 sudoers 文件中。否则,您稍后将无法以 root 身份登录。有关更多信息,请参阅“如何在 FreeBSD 服务器上添加、删除和授予用户 Sudo 权限”。
$ sudo vim /etc/ssh/sshd_config
或者使用 vim 文本编辑器直接跳转到 PermitRootLogin 行
$ sudo vim +/PermitRootLogin /etc/ssh/sshd_config
:
找到 PermitRootLogin 并按如下方式设置:
PermitRootLogin no
保存并关闭文件。我将在 Ubuntu Linux 上将一个名为 vivek 的用户添加到 sudoers:
# adduser vivek
最后,重新加载/重新启动 sshd 服务器,根据您的 Linux/Unix 版本输入命令:
## CentOS/RHEL/Fedora (older version) Linux server reload sshd ## sudo service sshd reload ## CentOS/RHEL/Fedora (latest version i.e. systemd based) Linux server reload sshd ## sudo systemctl reload sshd ## Debian/Ubuntu Linux (older version) server reload sshd ## sudo /etc/init.d/ssh reload ## Debian/Ubuntu Linux (systemd based latest) server reload sshd ## sudo systemctl reload ssh ## Generic Unix method to reload sshd ## sudo kill -HUP `cat /var/run/sshd.pid` OR sudo kill -HUP $(cat /var/run/sshd.pid)
5:如何添加或替换现有私钥的密码?
要更改密码,请输入以下命令:
$ ssh-keygen -p
6:如何备份现有的私钥/公钥?
只需将文件复制到备份服务器或外部 USB 笔/硬盘即可:
## Copy files to home based nas server ## rsync -avr $HOME/.ssh user@home.nas-server:/path/to/encrpted/nas/partition/ ## Copy files to usb pen drive mounted at /mnt/usb ## cp -avr $HOME/.ssh/ /mnt/usb/backups/
我如何保护我的 ssh 密钥?
- 始终使用强密码。
- 不要在网上任何地方分享您的私钥或将其存储在不安全的云存储中。
- 限制帐户的权限。
如何创建和设置 OpenSSH 配置文件来为经常访问的服务器创建快捷方式?
请参阅如何创建和使用 OpenSSH ssh_config 文件以获取更多信息。
结论
本页介绍了如何设置 ssh 密钥以进行身份验证。使用 man 命令或 help 命令阅读以下手册页。例如:
有关更多信息,请参阅以下资源:
$ man ssh
$ man ssh-agent
$ man ssh-keygen
- keychain:为备份脚本设置安全无密码 SSH 访问
- Ubuntu / Debian Linux 服务器为 OpenSSH 安装 Keychain SSH 密钥管理器
- OpenSSH 项目主页在这里。
至此,您已经为 Linux 或类 Unix 系统设置了基于公钥的身份验证的 ssh。
- 20 个 OpenSSH 服务器最佳安全实践
- 如何在 Linux / Unix 系统上设置 SSH 密钥
- Linux / Unix 用户的 OpenSSH 配置文件示例
- 审计 Linux/Unix 上的 SSH 服务器和客户端配置
- 如何在 FreeBSD 上安装和升级 OpenSSH 服务器
- Ubuntu Linux 安装 OpenSSH 服务器
- 在 Alpine Linux 上安装 OpenSSH 服务器(包括 Docker)
- Debian Linux 安装 OpenSSH SSHD 服务器
- 配置 OpenSSH 以监听 IPv6 地址
- OpenSSH 服务器连接在几分钟不活动后断开
- 在 OpenSSH 身份验证之前显示横幅/消息
- 强制 OpenSSH(sshd)仅监听选定的多个 IP 地址
- OpenSSH 使用 ssh-keygen 命令更改密码
- 重复使用 SSH 连接以通过多路复用加速远程登录过程
- 重新启动 SSHD 服务器之前检查语法错误
- 更改 Linux 或 Unix 服务器上的 ssh 端口
- OpenSSH 拒绝或限制用户和组的访问
- Linux OpenSSH 服务器拒绝 root 用户访问/登录
- 在 Linux 上禁用 ssh 密码登录以提高安全性
- SSH ProxyCommand 示例:通过一台主机到达服务器
- OpenSSH 多路复用器可加速 OpenSSH 连接
- 在远程 Linux / UNIX 服务器中安装 / 附加 SSH 密钥 Authorized_keys
- 使用 ssh-copy-id 与监听不同端口的 OpenSSH 服务器配合使用