SSH服务
安全的shell,开源实现有OpenSSH和Dropbear等
原理
基于密码登录:
基于公钥登录:
服务端配置
服务端的公钥私钥在目录/etc/ssh/
中,默认私钥的用户组为ssh_keys,如果发现为644,则不安全
CentOS中重新生成主机密钥对,删除旧的重启sshd即可
查询任意主机的公钥:ssh-keyscan -p 22 -t rsa github.com
,可以追加到~/.ssh/known_hosts
PermitRootLogin no
,禁止root登录
UseDNS no
,不适用DNS,加快登录,还可以禁用GSS:GSSAPIAuthentication no
限制登录用户,按以下顺序判断:DenyUsers, AllowUsers, DenyGroups, AllowGroups
ListenAddress
,可限定IP和端口
限制登录的IP地址:
cat /etc/hosts.allow
sshd:192.168.47.7:allow
cat /etc/hosts.deny
sshd:ALL
也可以使用iptables结合ipset,动态设置
锁定配置文件,chattr +i /etc/ssh/sshd_config
公钥登录
因为密码登录时对比的是/etc/shadow
,而该文件任何用户都可读,相当于有个彩虹表,有通过GPU暴力破解的风险,一般不允许密码登录。公钥因为权限是600,安全性高很多
特别注意,一些服务的用户通过file:///
等协议读取用户密码文件
PasswordAuthentication no
可以关闭密码登录
端口转发
ssh -L -Nf 127.0.0.1:8080:192.168.47.2:80 root@192.168.47.1
本地转发,即监听本地端口8080,发送到该端口报文会转发到远程的指定IP(192.168.47.2)和端口(80)上,N指定不分配tty,f指定后台运行
ssh -R -Nf 127.0.0.1:8080:192.168.47.20:80 root@192.168.1.10
远程转发,即监听远程(192.168.1.10)端口8080,发送到该端口的报文会转发到本地的指定IP(192.168.47.20)和端口80上
ssh -D 127.0.0.1:8080 -Nf root@192.168.1.10
动态转发,相当于正向代理,本地所有报文通过SSH发往远程主机
客户端使用
生成密钥对:ssh-keygen -b 2048 -t rsa
上传公钥:ssh-copy-id -i .ssh/id_rsa -p 22 root@192.168.47.7
也可以手动追加到~/.ssh/authorized_keys
,但文件权限一定要是600
通过ssh-keygen可以修改私钥的密码
不同主机不同密钥配置,.ssh/config
文件:
Host repo1.github.com
HostName github.com
User git
IdentityFile ~/.ssh/alice_github.id_rsa
IdentitiesOnly yes
Host repo2.github.com
HostName github.com
User git
IdentityFile ~/.ssh/bob_github.id_rsa
IdentitiesOnly yes
密钥管理
ssh-agent可以管理私钥,特别是可以设置过期时间,到期自动删除内存中的私钥
eval $(ssh-agent)
,开启agent
ssh-add -t 36000 xxx
,该命令还可以删除/列出/锁定管理的私钥
通过ssh_config可以配置不同的主机使用不同的私钥
SecureCRT配置
全局配置,缓冲区大小,字体大小,光标
Terminal中,Anti-idle设置,可以防止意外掉线
配置日志路径:%H_%Y%M%D.log,连上开始记录,追加记录
多窗口执行,View->Command Window,在命令窗口中选择发送到所有会话