SSH使用简单记录

简单记录SSH的用法

SSH登陆

  1. 首次登录时发送服务器公钥的fingerprint,要求用户确认。

    用户确认后公钥保存到known_hosts,默认可信。

  2. 密钥登陆:ssh -p [port] -i [id_file] [user]@[ip_address]

  3. 公钥登陆:客户端ssh-keygen生成密钥对,ssh-copy-id传输公钥到服务器(自动写入authorized_keys)。

    $ ssh-keygen -t rsa
    # 生成SSH公私钥对
    # -t 使用rsa算法 [dsa|ecdsa|ed25519|rsa]
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub auth@192.168.1.10
    # 将公钥传输到SSH服务器
    # -i 指定公钥文件
    # user@address 指定SSH服务器的IP地址和公钥对应的用户
    # 需要使用口令方式通过认证
    
  4. 私钥登陆:服务器ssh-keygen生成密钥对,将公钥追加到服务器authorized_keys,通过scp或其他安全方式传输私钥到客户端。

  5. ssh-copy-id的替代方式:

    Linux机器:

    ssh <user>@<ip_address> "cat >> authorized_keys" < id.pub
    

    Windows机器:

    > Get-Content new.pub | ssh <user>@<ip_address> "cat >> authorized_keys"
    
  6. 权限:通常公钥权限644,私钥权限600。authorized_keys权限600,known_hosts权限644。

    服务器端私钥权限为640、644之后,SSH服务器会自动忽略对应密钥对(认为该私钥是不安全的)。

    authorized_keys权限改为620、622之后,SSH服务器会拒绝读取(认为公钥不安全),只能口令登陆。

  7. 文件:

    authorized_keys在服务器端保存客户端的公钥。用于密钥登陆时加密随机挑战。防止冒用。

    known_hosts在客户端保存服务器的公钥。用于公钥的比较确认,口令登录时用公钥加密口令。

  8. scp:基于SSH的加密文件传输,使用单行命令传输文件。

  9. sftp:基于SSH的加密文件传输,类似FTP的操作和使用方式。

SSH连接

信息交换

  1. TCP连接:三次握手建立TCP连接。发送SYN,接收SYN ACK,发送ACK。

  2. 版本协商:双方交换SSH版本。

  3. 算法协商:包括公钥算法,加密算法,MAC(消息验证码)算法,压缩算法列表

  4. 密钥协商:Elliptic Curve Diffie-Hellman Key Exchange

    客户端发送ECDH Key Exchange Init报文。包括客户端交换密钥Q_C。

    服务器发送ECDH Key Exchange Replay报文。包括ECDSA服务器公钥Q和ECDH交换密钥Q_S。

    接下来通过发送New Keys报文表示交换密钥已经建立。

  5. 登陆认证:(传输过程使用交换密钥对称加密)

    口令认证过程:服务器发送公钥。客户端使用服务器公钥加密口令。服务器使用私钥解密验证。

    密钥认证过程:服务器使用客户公钥加密发送随机字符串。客户端使用客户私钥加密。

防御中间人攻击

中间人拦截客户端的连接请求并发送自己的公钥,从而假冒服务器窃取用户信息。

  1. 客户端首次连接时保存服务器的公钥。中间人攻击时,中间人发送的服务器公钥与保存的公钥不同。
  2. SSH引入了公钥认证机制,通过安全的方式发送公钥保存在服务器的authorized_keys中。

端口转发

socks代理

要求机器A配置socks代理、机器B做代理服务器、访问web服务。

# 机器A
ssh -f -N -D 127.0.0.1:1080 <user>@<addressB>

机器A浏览器设置代理为127.0.0.1:1080即可通过机器B访问网页。

远程转发

要求机器A访问本地端口、机器B做代理服务器、访问目标网站。

# 机器A
ssh -f -N -R 3456:bbs.fudan.edu.cn:23 <user>@<addressB>

机器A访问localhost:3456会经由机器B访问复旦BBS。

本地转发

要求机器A访问本地端口、机器B开启web服务并做代理。

# 机器A
ssh -f -N -L 3456:lohalhost:80 <user>@<addressB>

机器A访问localhost:3456实际访问到addressB:80。

SSH设置

  1. 设置规则之后重启服务

    systemctl restart ssh
    # 或者使用 service
    
  2. 禁止使用密码登录

    # /etc/ssh/ssgd_config
    PasswordAuthentication no
    
  3. 拒绝用户登录

    # /etc/ssh/sshd_config
    DenyUsers user1
    
  4. 设置用户白名单

    # /etc/ssh/sshd_config
    # 按优先级从高到低
    # 指定禁止某用户登录
    DenyUsers <user>
    # 指定仅限某用户登录
    AllowUsers <user>
    # 指定禁止某用户组登录
    DenyGroup <group>
    # 指定仅限某用户组登录
    AllowGroup <group>
    
  5. 设置IP白名单

    # 按优先级从高到低
    # /etc/hosts.allow
    sshd:192.168.198.1:allow
    # /etc/hosts.deny
    sshd:ALL
    
  6. 禁止登陆root用户,如果使用弱口令的话可能被爆破

    # /etc/ssh/sshd_config
    PermitRootLogin no
    
  7. 禁止无密码的登录

    # /etc/ssh/sshd_config
    PermitEmptyPasswords no
    
  8. 更改端口

    # /etc/ssh/sshd_config
    Port 40121
    
Lei Yang
Lei Yang
PhD candidate

My research interests include visual speech recognition and semantics segmentation.