SSH使用简单记录
简单记录SSH的用法
SSH登陆
-
首次登录时发送服务器公钥的fingerprint,要求用户确认。
用户确认后公钥保存到known_hosts,默认可信。
-
密钥登陆:ssh -p [port] -i [id_file] [user]@[ip_address]
-
公钥登陆:客户端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地址和公钥对应的用户 # 需要使用口令方式通过认证
-
私钥登陆:服务器ssh-keygen生成密钥对,将公钥追加到服务器authorized_keys,通过scp或其他安全方式传输私钥到客户端。
-
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"
-
权限:通常公钥权限644,私钥权限600。authorized_keys权限600,known_hosts权限644。
服务器端私钥权限为640、644之后,SSH服务器会自动忽略对应密钥对(认为该私钥是不安全的)。
authorized_keys权限改为620、622之后,SSH服务器会拒绝读取(认为公钥不安全),只能口令登陆。
-
文件:
authorized_keys在服务器端保存客户端的公钥。用于密钥登陆时加密随机挑战。防止冒用。
known_hosts在客户端保存服务器的公钥。用于公钥的比较确认,口令登录时用公钥加密口令。
-
scp:基于SSH的加密文件传输,使用单行命令传输文件。
-
sftp:基于SSH的加密文件传输,类似FTP的操作和使用方式。
SSH连接
信息交换
-
TCP连接:三次握手建立TCP连接。发送SYN,接收SYN ACK,发送ACK。
-
版本协商:双方交换SSH版本。
-
算法协商:包括公钥算法,加密算法,MAC(消息验证码)算法,压缩算法列表
-
密钥协商:Elliptic Curve Diffie-Hellman Key Exchange
客户端发送ECDH Key Exchange Init报文。包括客户端交换密钥Q_C。
服务器发送ECDH Key Exchange Replay报文。包括ECDSA服务器公钥Q和ECDH交换密钥Q_S。
接下来通过发送New Keys报文表示交换密钥已经建立。
-
登陆认证:(传输过程使用交换密钥对称加密)
口令认证过程:服务器发送公钥。客户端使用服务器公钥加密口令。服务器使用私钥解密验证。
密钥认证过程:服务器使用客户公钥加密发送随机字符串。客户端使用客户私钥加密。
防御中间人攻击
中间人拦截客户端的连接请求并发送自己的公钥,从而假冒服务器窃取用户信息。
- 客户端首次连接时保存服务器的公钥。中间人攻击时,中间人发送的服务器公钥与保存的公钥不同。
- 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设置
-
设置规则之后重启服务
systemctl restart ssh # 或者使用 service
-
禁止使用密码登录
# /etc/ssh/ssgd_config PasswordAuthentication no
-
拒绝用户登录
# /etc/ssh/sshd_config DenyUsers user1
-
设置用户白名单
# /etc/ssh/sshd_config # 按优先级从高到低 # 指定禁止某用户登录 DenyUsers <user> # 指定仅限某用户登录 AllowUsers <user> # 指定禁止某用户组登录 DenyGroup <group> # 指定仅限某用户组登录 AllowGroup <group>
-
设置IP白名单
# 按优先级从高到低 # /etc/hosts.allow sshd:192.168.198.1:allow # /etc/hosts.deny sshd:ALL
-
禁止登陆root用户,如果使用弱口令的话可能被爆破
# /etc/ssh/sshd_config PermitRootLogin no
-
禁止无密码的登录
# /etc/ssh/sshd_config PermitEmptyPasswords no
-
更改端口
# /etc/ssh/sshd_config Port 40121