SSH

安全外壳协议(Secure Shell Protocol,SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。

SSH 通用命令

无论是 win 还是 Linux 远程连接命令都是相同的。

1
2
ssh [-P <port>] <user>@<addr>
ssh -J <user0>@<addr0>:<port0> <user1>@<addr1> # 以 user0 为跳板登录 user1

默认端口 22 。

密钥

现代加密技术常常使用非对称加密,当发送者使用私钥对一段信息加密后,接收者可使用公钥来快速解密。ssh 也可以使用这种加密方式来验证身份。

1
2
cd ~/.ssh
ssh-keygen -t Ed25519 # 生成密匙

DSA - ❌ 已经从数学层面被证明不安全,所以永远不要用它
RSA - 在各种设备、各种 SSH 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择
ECDSA - ❗密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的 VPS 上有值得 NSA 关注的东西就不要用它
Ed25519 - 这是一个与 ECDSA 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门

Linux 中 SSH 的使用

添加私钥

1
2
eval 'ssh-agent'
ssh-add <your_keyfile>

注意,仅对本次登录有效,笔者将其添加进启动文件了。

添加公钥

1
2
3
mkdir ~/.ssh/
echo <your_pub>>>~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

❗若文件权限不正确,系统认为文件不安全进而不使用密钥认证。

Windows 中 SSH 的使用

win 果然是最难配置的系统

添加私钥

  • 方法一: 配置文件

    配置 ‘~/.ssh/config’ 文件

    1
    2
    3
    4
    5
    6
    Host github
    Hostname ssh.github.com
    Port 443
    User git
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand connect -S 127.0.0.1:5411 %h %p
  • 方法二: ssh-agent

    爱来自微软官方文档

    1
    2
    3
    4
    5
    6
    7
    # 将 ssh-agent 服务配置为在每次重启计算机时自动启动
    Get-Service ssh-agent | Set-Service -StartupType Automatic # 需要管理员权限
    Start-Service ssh-agent
    Get-Service ssh-agent

    # 添加私钥
    sudo ssh-add $env:USERPROFILE\.ssh\general_ed25519

笔者实在是没弄明白,懒得弄了😓

添加公钥

若要使用密钥,还需要在服务器上将公钥(~.ssh\id_Ed25519.pub)的内容放入文本文件中。文件的名称和位置取决于用户帐户是本地管理员组的成员还是标准用户帐户。

  • 普通用户

    需要放入 C:\Users\username.ssh\authorized_keys 的文本文件中。

    1
    2
    3
    $authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
    $remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"
    ssh username@domain1@contoso.com $remotePowershell # 自行更改远程目标
  • 管理员

    需要放入 C:\ProgramData\ssh\administrators_authorized_keys 的文本文件中。

    1
    2
    3
    $authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ecdsa.pub
    $remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""
    ssh username@domain1@contoso.com $remotePowershell # 自行更改远程目标

    一种不规范的简单方法:(只有这个方法成功了😓 垃圾微软文档)
    修改服务器配置文件[C:\ProgramData\ssh\sshd_config]。将下述文本注释掉。

    1
    2
    #Match Group administrators
    # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

    然后按照普通用户操作。