服务器免密登录
背景
在工作中使用密码登录有时候会出现这样或者那样的不方便,一是密码要输入,如果明文输入则不安全,二则一旦修改密码要重新分发到有权限的小伙伴
场景
在之前的工作中有很多场景需要免密等登录,使用免密带来的便利
- 可以免密登录远程机器,方便快捷,不受对方改密码的限制
- 可以使用rsync定时拷贝文件
- 使用scp进行文件拷贝
- 使用Ansible进行远程服务器管理等
可能存在的问题
免密虽然好用,但要配置,在使用过程中未免会遇到各种问题,我这边在Linux上遇到的问题有
- 公私钥不匹配
- .ssh权限问题
- 第一次必须手动输入yes的问题
- windows上无法使用免密的问题
实现
Linux上设置
ssh认证的原理简单来说是这样的,在本地的私钥和远程机器的中authorized_keys存储的公钥进行配对,配对成功即可实现远程登录
Linux上首先这么操作的,一路回车,会在生成当前用户家目录下生成.ssh文件夹和文件夹下的id_rsa(私钥)id_rsa.pub(公钥)
[test@localhost~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Created directory '/home/test/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:sFqV+jGW52h9fuyREovdSGk9n4s5y3/SHm4mCwwpMd4 test@localhost
The key's randomart image is:
+---[RSA 2048]----+
| |
| . |
| .oo |
| .=+.. o |
| +oSE. = o |
| o o.Bo= = +.|
| . + +o*.++.|
| . oo+B+=|
| .OX*o|
+----[SHA256]-----+
目录结构
[test@localhost~]$ tree .ssh/
.ssh/
├── id_rsa
└── id_rsa.pub
0 directories, 2 files
[test@localhost~]$
将公钥拷贝到远程机器
[test@localhost~]$ ssh-copy-id test@192.168.31.22
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/test/.ssh/id_rsa.pub"
The authenticity of host '192.168.31.22 (192.168.31.22)' can't be established.
ECDSA key fingerprint is SHA256:yjNMl5BfVvsJ3HmpCPv3B3Y+5XbT4mxwMnDGUHSpnBs.
ECDSA key fingerprint is MD5:0d:08:47:ee:4f:32:a6:8b:8f:2d:dd:fa:f4:f3:e0:5a.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
test@192.168.31.22's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'test@192.168.31.22'"
and check to make sure that only the key(s) you wanted were added.
[test@localhost~]$
或者手动将公钥拷贝到~/.ssh/authorized_keys文件中,切记公钥拷贝的时候不可换行
正常情况下,这样就完成了免密登录
ssh 'test@192.168.31.22'
在Linux上遇到的问题大部分是权限的问题
.ssh 权限要700 -rwx------
id_rsa 权限 600 -rw-------
authorized_keys 权限 600 -rw-------
远程登录用户的家目录755以下
如果指定私钥登录则命令是
ssh -i /path/id_rsa test@192.168.31.22
windows上设置
windows上设置和Linux上的方式是一样的,但windows上并没有Linux的命令则需如下操作
-
安装gitbash
主机和客户机都要安装,步骤简单一路回车即可,下载地址 -
客户机上安装openssh
只在测试机安装,回车都不用,直接默认地址,要用管理员安装下载地址 -
调整注册表
客户机调整注册表,wind+r 输入regedit,找到openssh对应的选项,新增DefaultShell,这样远程登录后是gitbash的方式登录
-
调整openssh的配置
这个坑了我好几天,在问了大佬才知道要调整配置
在C:\ProgramData\ssh目录中有个sshd_config的配置,将AuthorizedKeysFile注释掉,不注释掉则无法完成登录
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
还没完,还要重启sshd服务
# 查看sshd的状态
Get-Service -Name sshd
PS C:\Users\Administrator> Get-Service -Name sshd
Status Name DisplayName
------ ---- -----------
Running sshd OpenSSH SSH Server
# 重启
sshd
Restart-Service sshd
# 停止
Stop-Service sshd
# 启动
Start-Service sshd
到这里已经完成了,折腾了我好几天,一个注释的事,学艺不经,继续努力。