ssh服务
ssh服务是什么?
- ssh-- secure
shell,是一个远程登录程序,一个对数据进行加密传输的服务,主要用在远程登录(一般来说用于远程登陆但是自己也可以登录自己)允许用户在远程机器上执行任何命令,让标准输出在本地;早期明文远程协议是telnet,但之后变成了测试工具。 - ssh是应用层协议,主要在HP-UX,LINUX,AIX,UNIX系统上都有,windows上没有
-ssh默认端口是22
ssh常见的两种登录方式
- 密码登录
- 密钥登录(免密码登录)
ssh配置
- 官方站点:http://www.openssh.com
- 主要软件包:openssh-server、openssh-clients
- 服务名:sshd
- 服务端主程序:/usr/sbin/sshd 这是一个可执行文件 (直接启动systemctl start sshd 关闭 systemctl stop sshd)
- 客户端主程序:/usr/bin/ssh
- 服务端配置文件:/etc/ssh/sshd_config
- 客户端配置: ~/.ssh/config
服务启动:一是找到它的主程序文件,直接运行,第二是使用systemctl启动,但是在使用systemctl服务之前,要确保/lib/system/system 下的.service文件里面是否有相应的服务。
修改ssh配置
配置文件的位置 /etc/ssh/sshd_config
vim /etc/ssh/sshd_config
- Port 2233 #修改默认监听端口(默认22端口)
- ListenAddress 192.168.0.132 #设置本机监听ip地址,默认为0.0.0.0(表示在本机任意ip地址上监听)
- PubkeyAuthentication yes #是否开启公钥认证
- AuthorizedKeysFile .ssh/authorized_keys #配置公钥认证的文件
- PasswordAuthentication no #是否开启密码认证,默认为yes
- UsePAM yes #使用pam认证 (pam认证模块 --》配置路径/etc/pam.d 这个目录下面存放的是每个需要认证的服务的配置,文件名就是服务名)
- UseDNS yes #是否将客户端主机名解析为ip(此过程不顺利的话,会非常的慢,会影响登陆认证的速度,可以将其设置为no)
- PermitRootLogin no #不允许root用户登陆,默认为yes
修改配置之后reload重新加载
查看ssh服务是否启动
- ps -ef|grep ssh
- pidof sshd
- netstat -aptln|grep ssh
- lsof -i:22
两种加密方式
对称加密
加解密的钥匙都是同一把(双方都知道,就像接暗号)(两把钥匙)所以怎么样安全的保存这个密钥成为了一个很重要的问题, 很难保证这个密钥不被泄漏
非对称加密
生成一对公私钥,私钥自己保管,公钥可以给其他人。(一个钥匙一把锁),公私钥对是成对存在的,一个用于加密,一个用于解密。具体哪个为私钥,哪个为公钥就看使用者自己管理。
需要注意的是:
使用公钥进行加密,私钥解密,基本用于数据加密
使用私钥加密公钥解密,用于认证
公钥认证,免密码登入步骤
以A登录B为例
1、在A机器上生成公私钥对,生成之后默认会放在当前用户家目录下的.ssh/文件下 id_rsa(私钥),id_rsa.pub(公钥),使用 ssh-keygen生成(中间一直敲回车,选择默认)
2、在B机器上目标用户的家目录下~/.ssh/authorized_keys文件里将A机器的公钥复制粘贴过来,如果没有这个文件的话就创建,并且设置权限为600
3、查看公钥认证是否成功,在A机器上执行 ssh root@B机器的ip(如果id_rsa没有放在家目录下,那么在用ssh时接-i指定id_rsa私钥路径),不需要输入密码就可以登录到B机器,则表示免密码登录成功。
公私钥认证排错
- 确保公钥复制正确了
- 确保~/.ssh/authorized_keys文件权限为600
- 确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限
注意:登陆时默认会去寻找家目录下的~/.ssh/id_rsa去进行验证,所以尽量不要在生成key的时候将它的默认路径更改。 - 注意关闭防火墙和selinux(iptables –F 清空防火墙规则)
ssh命令参数
- -vvv 看详细信息
- -l 指定登陆的用户名
- -p 指定server的端口
- -i 指定私钥文件,默认会在~/.ssh/去找私钥
- -o 接特定设置选项
ssh 192.168.0.35 #不接任何用户名,会默认以当前A机器所在用户登陆B机器同名的用户,不管B机器有没有这个用户
登录验证原理
密码登录
client向server发送登陆请求,server将自己的公钥(服务器的公钥/etc/ssh 三对)发送给client。
client使用这个公钥,将密码进行加密,发送给server
server用私钥解密登陆密码,验证合法性
server返回验证结果给client
公钥认证登录
client端生成公钥对,将公钥追加在server端的~/.ssh/authorized_keys
发送登陆请求,server收到请求之后,生成随机字符串发送给client
client用自己的私钥对字符串进行加密,发送给server。
server收到加密字符串之后用公钥解密,比较解密出的字符串和之前生成的字符串是否一致最后返回结果给client
中间人攻击
- 在密码登录的过程中有一个问题, 怎么保证收到的公钥就是目标server的公钥?(中间人攻击)
如果一个攻击者中途拦截了client的登陆请求,发送自己的公钥给client,client端就会用攻击者的公钥进行数据加密,攻击者接收到信息后,用自己的私钥就可以解密了,这就窃取了client的登陆信息了。 - 为了解决这个问题,client端第一次登陆的时候,会进行一个登陆公钥确认。
确认server服务端的这个host主机摘要,确认成功之后就会将server端的pubkey保存在~/.ssh/known_hosts里面
以后每次连接都会验证这个know_hosts里的key和收到的pubkey是否一致。 - 查看公钥指纹ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub;server主机的pubkey保存在/etc/ssh/目录下,默认使用 ssh_host_ecdsa_key.pub
跳板机(堡垒机)
ssh-agent管理密钥 一个代理程序,帮助我们管理私钥
- 配置方法(以xshell为例):xshell–> 主机属性–》ssh --》勾选 使用xagent进行身份验证 勾选使用代理转发
- ssh-add id_rsa #添加主机密钥给agent管理
- ssh-add -l #查看agent管理了哪些密钥
安全加固
1、不能密码登录
2、不能使用root登录
3、修改默认端口
4、添加防火墙配置
5、使用跳板机登录
pssh pscp命令(批量处理)
pssh
- -h 指定主机文件列表,内容格式"[user@]host[:port]"
- -i 指定每个服务器的处理信息
批量传输文件
pscp.pssh
[luoziyao@a ~]$ pscp.pssh -h ip.txt pscptest /tmp #把当前目录下的pscptest文件传送到目标主机的/tmp目录下
[1] 17:37:21 [SUCCESS] luoziyao@192.168.0.48:2233
[2] 17:37:22 [SUCCESS] luoziyao@192.168.0.39:2233
ssh远程执行命令
ssh B “/usr/sbin/ip a”
scp命令
传输文件
- scp aa(文件) B:/tmp 把aa文件传输放在B机器的/tmp目录下
- scp B:/tmp/aa ./ 把B机器的/tmp/aa文件拷贝到当前机器的根目录下
- scp -P 22 onekey_install_mysql_binary_v3.sh root@192.168.77.132:/opt
没有指定别名的传输
传输目录
- scp -r adir B:
adir-1 100% 0 0.0KB/s 00:00
adir-2 100% 0 0.0KB/s 00:00 - scp -r adir B:bdir
adir-1 100% 0 0.0KB/s 00:00
adir-2 100% 0 0.0KB/s 00:00
sftp命令
sftp命令是一款交互式的文件传输程序,命令的运行和使用方式与ftp命令相似,但是,sftp命令对传输的所有信息使用ssh加密,它还支持公钥认证和压缩等功能。
- sftp apple@127.0.0.1
- sftp apple@127.0.0.1:/home/xx
- Connected to apple. sftp> ls 2q
aa adir bb bdir testdir testdir2 testhost - sftp> get 2q
Fetching /home/sanchuang/2q to 2q
/home/sanchuang/2q 100% 226 107.5KB/s 00:00
fping批量ping
- 根据文件指定ip去ping
fping -f ip-2.txt
192.168.0.39 is alive
192.168.0.48 is alive
- 根据网段去ping
fping -g 192.168.0.0/24
SSH实现访问控制
ssh tcp wrappers,SSH使用TCP Wrappers实现访问控制
- 主要配置文件
/etc/hosts.allow
/etc/hosts.deny
- TCP Wrappers可以控制哪些服务
受super daemon(xinetd)管理的服务
支持libwrap.so模块的服务 - TCP Wrappers的访问控制原则
首先检查 hosts.allow 文件,若找到相匹配的策略,则允许访问
否则继续检查 hosts.deny 文件,若找到相匹配的策略,则拒绝访问
如果两个文件中都没有相匹配的策略,则允许访问
ssh隧道
端口转发
1、关闭防火墙
2、关闭selinux
本地端口转发
实验环境:
a: 192.168.0.132
c: 192.168.0.48
b: 192.168.0.39
在c主机上执行: [root@C .ssh]# ssh -g -L 15577:192.168.0.39:80 192.168.0.39 -p 2233
把b主机的80端口映射到本地的15577端口
访问c主机的15577端口就是访问b主机的80端口
远程端口转发:
在c主机上执行:[root@C .ssh]# ssh -R 15566:192.168.0.39:80 -fN 192.168.0.132 -p 2233
把b主机的80端口映射到a主机的15566端口
访问a主机的15566 就是访问b主机的80