什么是ssh?
Secure Shell,协议
作用:数据在网络中可以加密传输
实现:openssh
客户端:openssh-client
服务器端:openssh
端口:22
实现:dropbear
远程登录
telnet
明文
客户端:telnet
服务器端:telnet-server
端口:23
默认情况下,禁止用root使用telnet登录系统
生产环境中使用telnet,测试和目标主机的指定端口是否可以正常的通信,也就是测试目标主机的指定端口是否开放(通过端口来判断服务是否处于开启状态)
进程
守护进程:一个服务维护一个进程,让进程工作在后台,每个进程都有自己的服务,可用service服务名 start|stop...进行管理
超级守护进程:一个服务维护多个进程
xinetd
瞬时守护进程:由超级守护进程负责管理的子进程就是瞬时守护进程
telnet
瞬时进程没有自己的服务,他的启动和管理依赖xinetd
ssh
telnet
scp
总结:ssh的功能
1、远程登录
2、远程文件传输
3、类似于ftp的文件传输功能,sftp
ssh的客户端和服务器端
ssh安全
ssh v1 <<废弃
RSA
ssh v2
RSA DSA
如何通过公钥来判断服务器是合法的?
ssh的配置文件
客户端配置文件:/etc/ssh/ssh_config
服务器端配置文件 /etc/ssh/sshd_config
linux ssh客户端收到的公钥文件的保存位置
~/.ssh/known_hosts
ssh服务器端的ip 加密算法 秘钥
客户端工具1-SSH
客户端使用ssh两种使用方式
基于口令做登录方式
基于秘钥做登录方式
基于口令的认证方式
格式
ssh [options][user@]host [COMMAND]
ssh [options][-l user] host [COMMAND]
说明:
user:指定以哪个用户的身份登录远程主机,如果不指定user,
则是以当前系统的用户来登录远程主机
command:直接在远程主机上执行命令,执行完毕后自动退出
选项:
-p port:指定远程主机的ssh所使用的端口,如果不指定此选项,默认连接22端口
-t :远程执行sudo命令
客户端配置文件
/etc/ssh/ssh_config
基于秘钥做登录认证(免密码登录)
原理:
客户端
一对秘钥
将公钥保存在服务器端的对应账户的家目录下的隐藏文件中(.ssh)
登录
服务器端就会向客户端发送质询
服务器端会用预先保存的公钥来加密一段数据,然后将加密数据发送给客户端,如果客户端可以
解密,则是合法用户。
linux免密码登录实现过程
准备linux虚拟机
172.20.225.70 clinet
172.20.225.71 server
第一步:在客户端生成一对秘钥
#ssh-keygen -t rsa
默认秘钥对的位置 /root/.ssh/id_rsa
id_rsa <<<秘钥文件
id_rsa.pub <<<公钥文件
ls ~/.ssh/
id_rsa id_rsa.pub
第二步:将公钥文件传到服务器端
root登录172.20.225.70,因此,这个公钥文件需要放在172.20.225.70的root用户的家目录下
ssh-copy-id [-i identifile] [user@]host
说明:-i 指定公钥文件的
user@host:指定传递到那个主机的那个用户的家目录下
工作原理:
1、将公钥文件传递到服务器端
2、将传递的文件改名为authorized_keys
3、修改文件的权限为600
实现命令
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
服务器收到客户端的公钥文件后,会自动改名为:authorized_keys
openssh客户端
windows客户端
xshell
putty
secureCRT
……
linux客户端
ssh、sftp、scp
客户端工具2-scp
作用:在两个主机上互相的传递文件
格式:
pull(拉取):scp [options] [user@]host:/pat/to/file /path/to/save
push(推送):scp [options] /path/to/push [user@]host:/path/to/save
选项:
-r:递归
-t:保留文件的属性不变(权限、时间戳)
-q:静默模式
-P port:指定使用的端口(默认使用22端口)
推送例子:将本地文件/root/new1.txt推送到172.20.225.71的tmp目录下
#scp /root/new1.txt [email protected]:/tmp/
拉取例子:将172.20.225.71下/root/11.sh 拉取到本机/home/下
#scp [email protected]:/root/11.sh /home
客户端工具3-sftp
格式:sftp IP
ssh的服务器端的配置文件
/etc/ssh/sshd_config
#Port 22 <<<< ssh服务所监听的端口
#ListenAddress 0.0.0.0 <<<< ssh服务所监听的地址
#PermitRootLogin yes <<<< 是否允许root远程登录
#MaxAuthTries 6 <<<< 指定最大尝试次数
#MaxSessions 10 <<<< 最大并行连接会话数量(同时多少个用户尝试连接服务器)
AuthorizedKeysFile .ssh/authorized_keys <<<<指定秘钥认证文件名称和路径
#PubkeyAuthentication yes <<<< 是否支持秘钥认证
PasswordAuthentication yes <<<< 是否支持口令认证
#UseDNS no <<<< 禁止做DNS反向解析
#ClientAliveInterval 0 <<<< 设置ssh登录的空闲超时时间,单位是秒
变量:TMOUT=xx
#AllowUsers= user1 user2 …… <<<< 设置白名单
#AllowGroups=gp1 gp2 <<<< 设置白名单
#DenyUsers= user1 user2 <<<< 设置黑名单
#DenyGroups=gp1 gp2 <<<< 设置黑名单
#PermitEmptyPasswords no <<<< 设置是否允许空密码
日志设施
记录日志的方式
SyslogFacility AUTHPRIV
AUTHPRIV意味着日志信息会记录到/var/log/secure
ssh服务器端日志
/var/log/secure
这个日志需要经常看
普通用户没有权限查看和修改
配置ssh实战
1、配置监听的端口
2、配置监听的地址
3、禁止使用ssh v1
4、设置用户白名单
5、设置空闲超时时间
6、结合防火墙设置ssd规则
7、禁止使用弱密码(数字 字母 特殊符号 长度位8字符以上)
8、尽量使用秘钥认证
9、禁止使用空密码登录
10、禁止root远程ssh
11、限制尝试次数与并行连接数量
12、将日志文件做异地备份
13、经常分析查看日志文件
centos6和centos7的区别
service sshd status
systemctl status sshd.service
用三个虚拟机实现如下效果
1、从A主机可以直接登录B C 两个主机
2、从A主机可以直接以远程的方式在B C 两个主机上执行命令
3:从A主机可以直接向B C 两个主机发送文件
案例:让baskup主机可以使用秘钥的方式登录web1 web2……且以普通用户身份
执行秘钥分发和文件传输等操作
1、创建普通用户(三个主机都创建)
[root@localhost ~]# useradd tuser
[root@localhost ~]# echo "123456" | passwd --stdin tuser
2、生成秘钥对
[root@localhost ~]# su - tuser
[tuser@localhost ~]$ ssh-keygen -t rsa
3、传递秘钥
[tuser@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
[tuser@localhost ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
4、登录
[tuser@localhost ~]$ ssh [email protected]
[email protected]'s password:
免密登录
[tuser@localhost ~]$ ssh [email protected]
[tuser@client ~]$
总结:在进行登录的时候,必须保证当前用户的家目录下有.ssh/id_rsa
在对方主机的指定用户的家目录下,必须要有公钥文件.ssh/authorized_keys
[tuser@localhost root]$ ssh [email protected] '/sbin/ip add'
[tuser@localhost root]$ ssh [email protected] '/sbin/ip add'
批量获取主机的信息
userName="tuser"
for i in 67 68 69 70 71
do
ip="172.20.225.$i"
if ! ping -c1 -W1 $ip &>/dev/null;then
echo "The host $ip is not exist."
else
res=`ssh ${userName}@${ip} '/bin/df -h | grep sda1'`
echo "==========================ip:$ip====================="
echo "The disk use infomation:$res"
fi
done
批量向主机传递文件
让用户输入一个文件,则将文件传递到所有的主机
如果传输成功,提示绿色成功,如果传输失败,提示红色失败,如果文件不存在,则提示无此文件。
#!/bin/bash
#author:lichao
#date:20190809
#function: use ssh to send file
#mail:[email protected]
userName="tuser"
funFile=/etc/init.d/functions
if [ ! -e $funFile ];then
echo "Error. the funcation file not exist."
exit 19
else
. $funFile
fi
read -p "Please enter a file: " fileName
if [ ! -e $fileName ];then
echo "no such file."
echo "bye."
exit 12
fi
for i in 70 71
do
ip="172.20.225.$!"
if ping -c1 -W1 $ip &>/dev/null;then
if scp -rq $fileName $userName@$ip:~/;then
action "send file to $ip" /bin/true
else
aciton "send file to $ip" /bin/false
fi
else
action "send file to $ip" /bin/false
fi
done
案例:将文件传递到目标主机的非家目录下
[tuser@localhost root]$ echo "test page".test.page
test page.test.page
[tuser@localhost ~]$ scp test.page [email protected]:/etc/
scp: /etc//test.page: Permission denied
[tuser@localhost ~]$ scp test.page [email protected]:~/
test.page
没有权限
分两步:
1、将文件传递到目标主机的家目录下
2、远程执行移动命令,将家目录下的文件移动到目标位置
[tuser@localhost ~]$ scp test.page2 [email protected]:~/
test.page2 100% 10 10.8KB/s 00:00
bash-4.2# ls /home/tuser/
.bash_history .bash_logout .bash_profile .bashrc .ssh/ test.page test.page2
bash-4.2# visudo
tuser ALL=(ALL) NOPASSWD: /bin/mv
[tuser@localhost ~]$ ssh -t [email protected] 'sudo mv ~/test.page2 /etc/'
Connection to 172.20.225.70 closed.
bash-4.2# ls /etc/te
terminfo/ test.page1 test.page2
配置sshd服务
端口
0-65535
小于1024的端口:是由系统保留使用的
自定义端口通常用1024以上的端口
端口的作用:在系统当中唯一的标识一个进程
这样就可以现实将发送给指定端口的数据转发到指定的进程中
系统中每个进程在启动的时候,会自动个向注册使用一个端口,当有发送到这个端口的数据的时候,
内核会根据端口的记录转发给指定的进程。
一个主机向另一个主机发送数据包的时候,在数据包中已经指定了这个数据包是给多少号端口的
作用:用来实现让客户端使用22端口来远程登录
配置文件:
/etc/ssh/sshd_config <<<<<这是服务端的配置文件
/etc/ssh/ssh_config <<<<<这是客户端的配置文件
安全操作
1、修改sshd的服务端口
# vi /etc/ssh/sshd_config
Port ***
# service sshd restart
2、解决xshell登录缓慢的问题
将UseDNS yes 改为 UseDNS no
将GSSAPIAuthentication 改为 GSSAPIAuthentication no
3、允许root用户登录
PermitRootLogin yes 改为no 后root用户登录不了系统