SSH:Secure Shell Protocol(22/tcp),安全远程登录
软件实现:
OpenSSH:SSH协议开源实现,CentOS默认安装
dropbear:另一种开源实现
协议版本:
v1:基于CRC-32做MAC,不安全,易受中间人攻击
v2:双方主机协议选择安全的MAC方式(基于DH做密钥交换,基于RSA或DSA实现身份认证)
登录认证:
基于password
基于key
相关包:
openssh
openssh-clients
openssh-server
工具:
基于C/S结构
Client:
Linux:ssh,scp,sftp,slogin
Windows:xshell,securecrt,putty
Server:
sshd
配置文件:/etc/ssh/ssh_config
#StrictHostKeyChecking no :首次登录不显示检查提示
登录格式:ssh [user@]host[command]
常用选项:
-p port:远程服务器监听端口
-b:指定连接源ip
-v:调试模式
-C:压缩方式
-X:支持x11转发
-t:强制伪tty分配
使用场景:A B C三台主机,A想远程登录C。但是C有防火墙策略不让A登录,但是发现B可以登陆C,
那么A就可以先远程登录到B然后在跳转到C。
实现:ssh -t IP_A ssh -t IP_B ssh IP_C(最后一台不需要使用-t选项)
注意:当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件公钥至
客户端~/.ssh/know_hosts中,下次连接时自动匹配私钥
服务器端:sshd
配置文件:/etc/ssh/sshd_config
帮助文档:man sshd_config
常用参数:
Port 22: 监听的端口,建议修改为普通端口,不再默认使用22,22会被各种IP扫描并尝试破解
ListenAddress [IP]: 监听的IP地址,sshd启动后默认监听的是*:22,所有IP都能尝试,将端口和IP绑定
格式192.168.0.110:22,这样只有一个IP才能访问sshd服务
HostKey: 有多个连接时会尝试使用哪一个
SyslogFacility AUTHPRIV:日志,AUT**加粗样式**HPRIV对应/var/log/secure日志文件
#awk '/Failed password/{ip[$(NF-3)]++}END{for(i in ip){print i,ip[i]}}' /var/log/secure
#统计连接IP次数
LoginGraceTime 2m: 在连接时,此选项定义等待时长,超时自动断开
PermitRootLogin yes: 是否允许root登录,改为NO后只允许普通用户登录,但是不限制,普通用户登录后
使用su切换至root用户
SrtictModes yes: 检查.ssh/目录下文件的所有者,权限等
MaxAuthTries 6: 密码错误连接失败时会再次让输入,定义错误失败连接次数,默认为3
MaxSessione 10: 同一个连接最大会话数量,就是一个窗口克隆出来的子窗口,会话窗口和连接窗口是两码事
PubkeyAuthentication yes:公钥验证,no就为不支持公钥key验证
PasswordAuthentication yes:口令验证,no就为不支持口令验证
PermitEmptyPasswords no:空口令登录,改为禁止,空口令很危险
GSSAPIAuthentication no:GSS验证,使用ssh口令登录时,需要等待,改为no连接速度会变快
UseDNS no: 反向域名解析,关闭后链接速度会变快
ClientAliveInterval 2: 检查客户端是否活跃,默认为秒,2秒检查一次,配合下面选项一起使用
ClientAliveCountMax 3: 如果客户端不活跃,每2秒检查一次,最多检查3次,3次后断开连接,配合上面选项使用。
GatewayPorts no: 端口转发时,是否启动网关功能,就是让不让别人通过你代理访问网站
MaxStartups: 未认证并发连接最大值,默认10
Banner none: 提示信息。与/etc/motd文件相似,登录时可自定义提示画面,无关紧要
allowusers cheng: 白名单,如果只有一个用户,那么其他用户都被拒绝,有了白名单不看黑名单,优先级高,最好定义黑名单
denyusers cheng: 黑名单,只拒绝了cheng一个用户,其他用户正常访问,建议定义黑名单,默认文件中没有这两项,需要手动添加
allowgroups : 白名单组
denygroups : 黑名单组
基于password验证登录步骤:
1. 客户端发起ssh请求
2. 服务端发送自己的公钥给客户端
3. 客户端根据服务端的公钥对密码进行加密,回传给服务端
4. 服务端私钥解密,密码正确则登录成功
基于key验证登录:
1. 客户端生成一对密钥(ssh-keygen),将公钥ssh-copy-id拷贝到服务端
2. 客户端发送连接请求,包括ip和用户名
3. 服务端在authorised_keys中查找,若有对应用户则随机生成一个字符串
4. 服务端使用客户端公钥对字符串进行加密,发送给客户端
5. 客户端使用私钥进行解密,将解密后的字符串发送给服务端
6. 服务端接收到的字符串与原字符串进行比对,一致则允许免密码登录
在接手一个环境时,需要清理ssh基于key验证的密钥,写个脚本将.ssh目录下authorized_keys文件清空
#!/bin/bash
#
user=root
password=galigaygay1121
while read ip ;do
expect << EOF
set timeout 100
spawn ssh-copy-id -i /root/.ssh/id_rsa $user@$ip
expect {
"yes/no" { send "yes\n" ;exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
done < /root/iplist.txt #iplist.txt文件放入需要清理的服务器ip
隧道:SSH为其他TCP连接提供的进行传输的安全通道,如telnet等
SSH能自动加密解密所有Client和Server之间的网络数据,还能转发其他TCP端口的网络数据,并提供相应加密解密功能
注:工作环境中防火墙会限制一些网络端口的使用,但会允许SSH的连接,即能够通过端口转发来使用SSH进行通讯
1. 加密SSH-Client端至SSH-Server端之间的通讯数据
2. 突破防火墙的限制完成一些之前无法建立的TCP连接
使用场景:工程师出差需要访问内网服务器IP为130,使用ssh端口转发实现,120IP为内网服务器,110为出差人员的IP,在120主机作为转发服务器
120主机:
ssh -R 9527:192.168.0.120:22 -fNg 192.168.0.110
# 命令完成后再110 上连接9527的端口,就会被转发到130服务器上,而且是安全的。
110主机上:
ssh 127.0.0.1 9527
# 连接输入用户名密码
此项需要配合配置文件实现/etc/ssh/sshd_config
#GatewayPorts no :取消注释,修改为yes
-L:指定将本地主机上给定的TCP端口的连接转发到指定的主机和端口,每当连接到本地端口时,连接通过安全通道转发,
并从远程主机连接到本地端口,PORT:ip:port
例:9527:192.168.0.110:22,9527为没有使用的随机端口,然后要转发到192.168.0.110的22端口。
-R:指定远程主机上给定的端口的连接将转发到本地端给定的端口
-fN:后台连接
-g:网关,别人可以使用任意IP连接9527端口,不加-g只有127.0.0.1监听端口,加上-g就是*:9527,任意IP都可以
通过本机当做代理
当用Firefox访问Internet时,本机的1080端口作为代理服务器,Firefox的访问请求被转发到ssh_server上,由server代替访问Internet
在被当作代理服务器的设备上执行:
ssh -D 1080 [root@]ssh_server-ip -fNg
#端口可自定义,只要是没用的,命令执行完成后在客户端ss -lnt就能看到1080端口已经监听
#同时需要在浏览器中配置代理,在设置中找到代理配置指定IP和端口
curl --scoks5 127.0.0.1:1080 192.168.0.130
#127.0.0.1是通过本机代理IP+端口,130是想要连接到的服务器IP
两种方式:
1)scp file user@IP:/dir/ :将本机文件复制到目标主机某目录下
2)scp USER@IP:/dir/file /root/ :将远程主机某目录下文件复制到本地
选项:
-C:压缩数据流
-r:递归复制
-p:保持原文件属性信息
-q:静默模式
-P port:指明远程主机的监听的端口
特殊用法:将远程主机上的文件拷贝到另一台远程主机
scp 192.168.0.120:/etc/fstab 192.168.0.130:/data/
基于ssh和rsh服务实现高效率的远程系统之间的复制文件
使用安全的shell连接为传输方式
rsync -av /etc host_ip:/tmp :复制目录和目录下文件
rsync -av /etc/ host_ip:/tmp :只复制目录下文件
特性:比scp更快,而且只复制不同的文件,没有改变的文件忽略
常用选项:
-n:模拟复制过程
-v:显示详细过程
-r:递归复制目录树
-p:保留权限
-t:保留时间戳
-g:保留组信息
-o:保留所有者信息
-l:将软链接文件本身进行复制(默认的)
-L:将软链接文件指向的文件复制
-a:存档,不保留ACL和selinux的属性
rsync和scp的区别:
在远程copy文件时,scp命令不论远程主机上是否有相同的文件都会重新复制一份
而rsync在copy文件时,如果远程主机已经有了相同的文件将不予操作
小型网络中自动化运维可选工具
默认是基于ssh服务的key验证方式
适用于所有主机已经基于ssh服务key验证之后使用此工具,没有ssh服务的可以验证加-A选项,手动输入密码
pssh是一个Python编写可以再多台服务器上执行命令的工具,也可以实现文件复制
选项如下:
--version
-h:主机文件列表,将需要管理的IP地址放在一个文件中,使用-h调用,内容格式"[user@]IP[:port]"
-H:主机字符串,直接跟IP地址,格式[user@]IP[:port]
-A:手动输入密码模式,如果已经基于key验证之后此选项可以忽略
-i:每个服务器内部处理信息输出
-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输入文件【可选】
-t:timeout超时时间设置,0无限制【可选】
-O:ssh的选项
-p:打印出服务器返回信息
-v:详细模式