ssh远程登录那些事
证书登录
密码登录不安全,可以使用证书登录。
服务端
sshd服务的配置文件/etc/ssh/sshd_config中,需要开启证书登录
PubkeyAuthentication yes
如果是root登录(不推荐),还需要保证root的ssh登录打开:
PermitRootLogin yes
另外,还有两个配置,跟登录有关。
一个是PasswordAuthentication,用于开启证书登录以后,是否还允许密码登录;
另外一个是AuthorizedKeysFile,用于配置证书登录的时候,在用户的什么文件里查找对应的证书,一般默认值是:.ssh/authorized_keys。
客户端
客户端,即需要用来登录远程服务器的机器。这机器上需要先生成一对密钥:
ssh-keygen
然后,把生成的.pub文件的内容,放入需要远程登录的SSH服务器的.ssh/authorized_keys文件里。
我们再使用ssh登录的时候,就会自动使用证书登录了。
私钥密码
我们使用ssh-keygen的时候,一般会要求输入密码,这是为了加密我们的私钥。
每次我们登录远程SSH服务端的时候,都需要输入这个密码,才能使用证书进行登录。
密码加密私钥
如果在生成证书的过程中,我们没有设置密码,也可以事后再加,方法是使用ssh-keygen的-p参数。
比如,我们登录服务端的证书私钥为.ssh/id_rsa,我们需要给它设置密码,可以:
ssh-keygen -p -f .ssh/id_rsa
之后再登录服务端就必须输入密码了。
移除私钥密码
如果反过来,想把密码保护的私钥文件,去除密码,也同样是这个命令这个参数,方法就是执行
ssh-keygen -p -f [私钥路径]
命令之后,输入原密码,再设置密码直接回车,即置空,密码就被移除了。
临时解锁私钥
有的时候,我们既想私钥文件被密码保护,又想在当前的Session状态下,不用重复输入密码,那怎么办呢?
方法是使用ssh-add。
ssh-add命令专门用户管理临时的解密私钥。
仍然以我们的私钥文件为.ssh/id_rsa为例。
我们可以执行:
ssh-add .ssh/id_rsa
之后,再当前登录状态下,再执行远程登录,就都不需要输入密码了。
管理临时私钥
管理临时私钥主要是ssh-add的三个参数:
ssh-add -l,显示当前解密的私钥ssh-add -d [私钥名称],释放解密的私钥ssh-add -D,释放所有解密的私钥
不同证书
当我们需要登录的主机,使用的证书不一样的时候,可以在.ssh/config中指定。
如:
host 192.168.56.101IdentityFile ~/.ssh/id_rsa1host 192.168.56.102 IdentityFile ~/.ssh/id_rsa2
其中,host字段可以使用空格添加多个,也支持通配符。
如:
host *.work.netIdentityFile ~/.ssh/id_workhost *.home.net 192.168.56.* IdentityFile ~/.ssh/id_rsa2
兼容老版本的openssh
为了在新的系统上(openssh版本很新),可以通过openssh登录到老的系统上去,需要做一些向下兼容。
我们当然可以改变系统的openssh设置,比如在/etc/ssh/ssh_config中添加
# add for ssh-rsa old openssh
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
但是,也可以在$HOME/.ssh/config中,只针对特定主机添加这种配置:
Host 192.168.58.110User rootPort 22HostKeyAlgorithms +ssh-rsaPubkeyAcceptedKeyTypes +ssh-rsa
之后,我们再通过ssh连接主机,仍然会返回一个错误:
ssh 192.168.58.110
ssh_dispatch_run_fatal: Connection to 192.168.58.110 port 22: error in libcrypto
这是因为,虽然我们在openssh程序中已经启用了老的算法的支持了,但是openssh依赖的openssl库,即上面错误里显示的libcrypto,仍然不支持老的算法。
根据这篇文章里说的,我们可以设置一下安全策略。
即执行:
update-crypto-policies --set DEFAULT:SHA1
但是这样仍然改变了全局的配置。
为了安全,还有一个改变更小的方法,就是不执行上面的语句,但是在连接老的openssh之前,设置一个环境变量:
export OPENSSL_ENABLE_SHA1_SIGNATURES=1
