SSH详解与实战
什么是ssh服务
SSH服务端是一个守护讲程 (daemon).他在后台运行并响应来自客户端的连接请求。 SSH服务端的讲程名为sshd,负责实时监听远程SSH客户端的远程连接请求,并进行处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接等。这个SSH服务就是我们前面基础系统优化中保留开机自启动的服务之。
ssh客户端包含ssh以及像scp(远程拷贝) slogin(远程登陆) sftp(安全FTP文件传输)等应用程序。
ssh的工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥给 SSH的客户端,此时,客户端本地再将密钥发回给服务端,自此连接建立。
windows服务端配置
执行以下命令(以管理员方式打开powershell)
# PowerShell
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
查看状态state,如果是NotPresent,则需要安装(windows默认安装客户端不安装服务端)
安装命令:
# PowerShell
# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
然后运行以下命令来启动 sshd service
:
# Start the sshd service
Start-Service sshd
# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'
# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}
用其他主机连接测试下:
ssh username@servername
默认是root用户,这个过程如果第一次会需要输入yes服务器会添加到包含 Windows 客户端上的已知 SSH 主机的列表中。
linux服务端配置
启动服务(任选其一):
systemctl start sshd
service start sshd
/etc/init.d/ssh start
root用户登录需要修改/etc/ssh/sshd_config中的PermitRootLogin参数为yes
然后重启sshd服务:systemctl restart sshd
用其他主机连接测试下:
ssh username@servername
密钥安全认证
密钥安全认证是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(锁头)(Public key)放在需要访问的目标服务器上,另外,还需要把私有密钥(钥匙)(Private key)放到SSH的客户端或对应的窖户端服务器上。
- 私钥不能在网络中传输---私钥可以解密公钥
- 公钥可以再网路中传输---公钥不能解密私钥
此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或者客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密"质询"(challenge)并把它发送给SSH客户端。
1.客户端创建秘钥对
ssh-keygen -t rsa
目录:~/.ssh/
包含一个私钥:id_rsa,一个公钥:id_rsa.pub
2.将私钥添加到ssh-agent中
ssh-agent
ssh-add ~\.ssh\id_rsa
3.部署公钥
## windows
普通用户
公钥 (~\.ssh\id_rsa.pub) 的内容需放置在服务器上的一个名为 authorized_keys (也可以通过sshd.config配置) 的文本文件中
# Make sure that the .ssh directory exists in your server's user account home folder
ssh username@domain1@contoso.com mkdir C:\Users\username\.ssh\
# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:\Users\username\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\Users\username\.ssh\authorized_keys
管理员用户
公钥 (~\.ssh\id_rsa.pub) 的内容需放置在服务器上的一个名为 administrators_authorized_keys 的文本文件中,该文件位于C:\ProgramData\ssh\administrators_authorized_keys
# Make sure that the .ssh directory exists in your server's user account home folder
ssh user1@domain1@contoso.com mkdir C:\ProgramData\ssh\
# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:\Users\username\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\ProgramData\ssh\administrators_authorized_keys
# Appropriately ACL the authorized_keys file on your server
ssh --% user1@domain1@contoso.com icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
## linux
有ssh-copy-id,可以直接复制
ssh-copy-id -i ~/.ssh/id_rsa.pub username@ip
这些步骤完成了基于密钥的身份验证所需的配置。 完成此项后,用户可以从具有私钥的任何客户端连接到 sshd 主机。
自动创建分发秘钥脚本
#!/bin/bash
#make key
rm -f /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
# fenfa
for ip in 8 31 41
do
echo ====fenfa key to host 172.16.1.$ip====
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no root@172.16.1.$ip"
echo ===============fenfa end==============
- 点赞
- 收藏
- 关注作者
评论(0)