Linux SSH密钥登录
warning:
这篇文章距离上次修改已过1608天,其中的内容可能已经有所变动。
本次实验环境为:阿里云 CentOS\_7.4\_x64 已开放22端口
编辑 sshd 配置文件
#编辑 /etc/ssh/sshd_config 文件
vim /etc/ssh/sshd_config
#设置是否使用RSA算法进行安全验证
RSAAuthentication yes
#允许客户端通过 public-key authentication来登陆
PubkeyAuthentication yes
#root用户能否通过 SSH 登录
PermitRootLogin yes
#禁用密码登录,建议确认完成全部设置,并可以使用密钥方式登录成功后再修改。
PasswordAuthentication no
#重启 SSH 服务
service sshd restart
更多关于 sshd_config
文件说明请点击这里
检查是否已经生成过ssh密钥
SSH密钥一般是在用户目录下的.ssh目录下:
- root用户是
/root/.ssh
- 普通用户是
/home/您的用户名/.ssh
如果没有进行过ssh密钥创建, .ssh
目录下应该仅有一个 known_hosts
文件。
如果您的 .ssh
目录如上图所示,请跳过生成密钥这一步。
生成密钥
如果您没有生成过密钥,或忘记密钥的密码可以执行下面的命令
#执行ssh-keygen命令创建密钥对,加密算法RSA,长度4096
ssh-keygen -t rsa -b 4096
rsa和dsa是生成密钥常用的两种加密算法,其他可选算法还有ecdsa、rsa1等。
Windows下可以使用putty-gen工具生成ssh密钥。
中途会提示输入密码,可以选择不输入,但会降低安全性。
密钥生成后会在当前目录下多出两个文件:
id_rsa
是私钥(不能外泄)id_rsa.pub
这个是公钥
小提示:更多的关于ssh-keygen
说明可以看这里
上传公钥到服务器上
最省事的方法
#复制公钥到服务器上
ssh-copy-id -i id_rsa.pub root@idzd.top
但是ssh-copy-id默认端口是22,如果您的SSH端口不是22,也就是远程服务器SSH端口修改成其他的了,就不能用这个命令。
当然也可以使用下面的方法来添加公钥到服务器上
#进入远程服务器需要SSH登录的用户的.ssh目录下
cd /root/.ssh
#检查是否有authorized_keys文件
ls
#若没有则执行以下命令创建
touch authorized_keys
#为新创建的空authorized_keys文件,授予600权限(注意:此处权限必须是600)
chmod 600 /root/.ssh/authorized_keys
#公钥id\_rsa.pub追加到authorized\_keys文件中(>>表示追加文件末尾,>表示将文件内容全部替换掉)
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
#重启远程主机的ssh服务
#ubuntu系统
service ssh restart
#debian系统
/etc/init.d/ssh restart
这里可以用这条命令解释下公钥的保存过程:
ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
测试
#登陆远程服务器
ssh root@idzd.top
#指定SSH登录所需密钥(绝对路径)
ssh -i /root/.ssh/id_rsa root@idzd.top
如果创建密钥对的时候设置了密码,则会提示您输入密码,没有的话会直接登录
如果你嫌终端默认的提示很乏味,可以看看这里
配置文件说明
配置文件 sshd_config
sshd_config是针对服务端的配置文件
#设置sshd监听的端口号。
Port 22
#设置sshd服务器绑定的IP地址。
ListenAddress 192.168.1.1
#设置计算机私人密匙的文件。
HostKey /etc/ssh/ssh\_host\_key
#定义服务器密匙的位数。
ServerKeyBits 1024
#设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
LoginGraceTime 600
#设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。
KeyRegenerationInterval 3600
#设置是否允许root通过ssh登录。这个选项从安全角度来讲应设成"no"。
PermitRootLogin no
#设置验证的时候是否使用“rhosts”和“shosts”文件。
IgnoreRhosts yes
#设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的"$HOME/.ssh/known_hosts”
IgnoreUserKnownHosts yes
#设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
StrictModes yes
#设置是否允许X11转发。
X11Forwarding no
#设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
PrintMotd yes
#设置在记录来自sshd的消息的时候,是否给出“facility code”。
SyslogFacility AUTH
#设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
LogLevel INFO
#设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。
RhostsAuthentication no
#设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。
RhostsRSAAuthentication no
#设置是否允许只有RSA安全验证。
RSAAuthentication yes
#设置是否允许口令验证。
PasswordAuthentication yes
#设置是否允许用口令为空的帐号登录。
PermitEmptyPasswords no
#的后面可以跟任意的数量的用户名的匹配串,这些字符串用空格隔开。主机名可以是域名或IP地址。
AllowUsers admin
配置文件 ssh_config
ssh_config是针对客户端的配置文件
#带“#”表示该句为注释不起作,该句不属于配置文件原文,意在说明下面选项均为系统初始默认的选项。说明一下,实际配置文件中也有很多选项前面加有“#”注释,虽然表示不起作用,其实是说明此为系统默认的初始化设置。
# Site-wide defaults for various options
#"Host"只对匹配后面字串的计算机有效,“*”表示所有的计算机。从该项格式前置一些可以看出,这是一个类似于全局的选项,表示下面缩进的选项都适用于该设置,可以指定某计算机替换*号使下面选项只针对该算机器生效。
Host *
#"ForwardAgent"设置连接是否经过验证代理(如果存在)转发给远程计算机。
ForwardAgent no
#设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。
ForwardX11 no
#设置是否使用基于rhosts的安全验证。
RhostsAuthentication no
#设置是否使用用RSA算法的基于rhosts的安全验证。
RhostsRSAAuthentication no
#设置是否使用RSA算法进行安全验证。
RSAAuthentication yes
#设置是否使用口令验证。
PasswordAuthentication yes
#设置如果用ssh连接出现错误是否自动使用rsh,由于rsh并不安全,所以此选项应当设置为"no"。
FallBackToRsh no
#设置是否在这台计算机上使用"rlogin/rsh",原因同上,设为"no"。
UseRsh no
#批处理模式,一般设为"no";如果设为"yes",交互式输入口令的提示将被禁止,这个选项对脚本文件和批处理任务十分有用。
BatchMode no
#设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为"yes"。
CheckHostIP yes
#如果设为"yes",ssh将不会自动把计算机的密匙加入"$HOME/.ssh/known_hosts"文件,且一旦计算机的密匙发生了变化,就拒绝连接。
StrictHostKeyChecking no
#设置读取用户的RSA安全验证标识。
IdentityFile ~/.ssh/identity
#设置连接到远程主机的端口,ssh默认端口为22。
Port 22
#设置加密用的密钥,blowfish可以自己随意设置。
Cipher blowfish
#设置escape字符。
EscapeChar ~