1,ssh远程管理
用在什么地方? 用来干嘛的?
SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。
2,openssh服务器
2.1 ssh协议
- 是一种安全通道协议
- 对通信数据进行了加密处理,用于远程管理
2.2 openssh
- 服务名称:sshd
- 服务端主程序:/usr/sbin/sshd
- 服务端配置文件;/etc/ssh/sshd_config
2.3 服务监听选项
- 端口号(默认端口号22),协议版本,监听ip地址
- 禁用反向解析
例如:禁用DNS反向解析地址可以提高服务器的响应地址:
[root@server1 ~]# vi //etc/ssh/sshd_config
#Port 22 //监听端口号为22
#ListenAddress 0.0.0.0 //监听地址为0.0.0.0
#UseDNS no //禁用DNS反向解析
root@server1 ~]# service sshd reload //重新加载sshd
2.4 用户登录控制
- 禁用root 用户,空密码用户(默认是允许root登录)
- 限制登录验证时间,重试次数
- AllowUsers, DenyUser
例如:
root@server1 ~]# vi /etc/ssh/sshd_config
LoginGraceTime 2m // 设置登录验证时间为2分钟
PermitRootLogin no //禁止root用户登录
MaxAuthTries 6 //最大重试次数为6
PermitEmptyPasswords no //禁止空密码用户登录
当希望只允许或禁止某些用户登录时,可以使用AllowUsers或DenyUser配置,两者用法类似,所以尽量不要同时使用。
例如:若只允许jerry和admin用户登录,且其中admin用户仅能够从ip地址为192.168.1.10的主机远程登录,可以参考以下操作:
[root@server1 ~]# vi /etc/ssh/sshd_config
AllowUsers jerry admin@192.168.1.10 //如果有多个用户可以用空格分隔 (这里的地址是客户机的地址)
2.5 登录验证方式
- 密码验证: 核对用户名,密码是否匹配
- 密钥对验证:核对客户的私钥,服务端公钥是否匹配
[root@localhost~]# vi letclssh/sshd_config
PasswordAuthentication yes //启动密码验证
PubkeyAuthentication yes //启动密钥对验证
AuthorizedKeysFile .ssh/authorized_ keys //指定公钥库位置
3,使用ssh客户端程序
3.1 命令程序 ssh, scp, sftp
- ssh命令 — 远程安全登录 ( 端口选项: -p 22 )
ssh user@host
- scp命令---- 远程安全复制
格式1:scp user@host:file1 file2
格式2 :scp file1 user@host:file2
两种格式举例说明如下:
服务器端复制文件给客户机
scp /etc/passwd root@192.168.1.101:/opt/ (服务器上打的)
客户机端复制文件给服务器
scp /opt/1111.txt zhangsan@192.168.1.100:/home/zhangsan (客户机上面打)
服务器端复制文件给客户机
scp zhangsan@192.168.1.100:/home/zhangsan/1.txt /root (客户机上打)
zhangsan@192.168.1.100's password:
1111.txt 100% 7 0.4kb/s 00:00
客户机端复制目录给服务器
scp -r /opt/ zhangsan@192.168.1.100:/home/zhangsan
zhangsan@192.168.1.100's password:
1111.txt 100% 7 0.4kb/s 00:00
passwd 100% 2379 1.3MB/s 00:00
- sftp命令 ----安全ftp上传下载(共用22号端口)
sftp user@host
例如
sftp zhangsan@192.168.1.100
zhangsan@192.168.1.100's password:
Connected to 192.168.1.100
sftp> ls
1111.txt opt
sftp> get 1111.txt
Fetching /home /zhangsan/1111.txt. to 1111.txt
/home /zhangsan /1111.txt 100% 7 0.4kb/s 00:00
4,构建密钥对验证的ssh体系
4.1 整体实现过程如下图理解
4.2 在客户机中创建密钥对
- ssh-keygen 命令
- 可用的加密算法:RSA,ecdsa或DSA
[zhangsan@localhost ~]$ ssh-keygen -t ecdsaGenerating public/private ecdsa key pair.
Enter file in which to save the key (/home/zhangsan/.ssh/id_ecdsa):Created directory '/home/zhangsanl.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again: //设置密钥短语
Your identification has been saved in /homelzhangsan/.ssh/id_ecdsa. //私钥文件位置
Your public key has been saved in /homelzhangsan/.ssh/id_ecdsa.pub. // 公钥文件位置
5,TCP Wrappers 访问控制
TCP wrappers是基于主机的访问控制系统。它用来阻止非授权的访问,只允许特定客户访问你服务器上的服务
5.1 为什么使用tcp wrappers
TCP wrappers在你的服务器与任何潜在的攻击者之间创建了额外的安全层。除了访问控制功能之外,它还提供日志记录和主机名验证。TCP wrappers在大多数Linux或者类UNIX系统能开箱即用,这使得它能够容易的配置,是对目前已经存在的防火墙的完美补充。
5.2 如何判断一个程序是否支持TCP wrappers
不是所有的程序都支持TCP wrappers。程序必须与libwrap库编译。常见的服务像sshd,ftpd和telnet默认支持TCP wrappers。我们可以使用如下命令来检查是否支持TCP wrappers:ldd /path-to-daemon | grep libwrap.so
ldd命令会打印出可执行文件共享依赖列表。把ldd命令输出管道给grep,来查找是否包含libwrap.so。如果有输出,则表示支持TCP wrappers。本篇文章我们主要针对sshd
5.3 保护原理
如图:
5.4 保护机制的实现方式
- 方式一:通过tcpd程序对其他服务程序进行包装
- 方式二:由其他服务程序调用libwrap.so.* 链接库
5.5访问控制策略的配置文件
- /etc/hosts.allow
- /etc/hosts.deny
5.6 设置tcp wrappers 的访问控制策略
- 策略格式 : 服务程序列表:客户端地址列表
- 服务程序列表
- 多个服务以逗号分隔,ALL表示所有服务
- 客户端地址列表
- 多个地址以逗号分隔,ALL表示所有地址
- 允许使用通配符?和*
- 网段地址,如192.168.4.或者192.168.4.0/255.255.255.0
- 区域地址,如.benet.com
5.7 策略的应用顺序
- 1,检查hosts .allow ,找到匹配则允许访问
- 2,再检查hosts.deny ,找到则拒绝访问
- 3,若两个文件中均无匹配策略,则默认允许访问
5.8 策略应用示例
- 仅允许以下地址访问sshd服务
- 主机61.63.65.67
- 网段192.168.2.0/24
- 禁止其他所有地址访问受保护的服务
[root@localhost~]# vi letc/hosts.allow
sshd:61.63.65.67,192.168.2.*
[root@localhost ~]# vi letc/hosts.deny
sshd:ALL
以上所有操作演示如下:
ssh服务器 192.168.1.100
ssh客户机 192.168.1.101
**************第一种方式:客户机用服务器端存在的系统账户密码登录************
--192.168.1.100服务器上的配置更改---
systemctl stop firewalld
setenforce 0
rpm -qa | grep openssh ###查看由没有装OPENSSH
vi /etc/ssh/sshd_config ##这边常规登录选项都不需要改,除非是服务器安全加固。
#Port 12345 ###改端口的地方 要去掉#号 改端口必须这个端口不能被占用
#ListenAddress 0.0.0.0 ##监听的IP地址,侦听的哪个网卡 哪个线路被连接过来。
#LoginGraceTime 2m ####登录时候允许你2分钟时间内输入密码,超过就提示超时
#PermitRootLogin yes ####允许不允许root 用户登录,线网是禁止root登录,一般是su - 提权
#MaxAuthTries 6 ####最大认证的次数。意思你最大输入多少次错误
#allowusers zhangsan wangwu@192.168.1.101,192.168.1.102
####只允许zhangsan和wangwu以192.168.1.101的ip登录,root账户不允许登录
systemctl restart sshd
netstat -anpt | grep sshd
修改端口号后验证:
ssh root@192.168.1.100 -p 12345
---192.168.1.101客户机上验证---
客户机以root用户尝试登录服务器
ssh root@192.168.1.100
Permission denied, please try again.
客户机以zhangsan用户尝试登录服务器
ssh zhangsan@192.168.1.100
zhangsan@192.168.1.100's password:
Last login: Sun Aug 4 21:51:07 2019 from 192.168.1.101
[zhangsan@localhost ~]$
客户机以wangwu用户尝试登录服务器
ssh wangwu@192.168.1.100
wangwu@192.168.1.100's password:
[wangwu@localhost ~]$
客户机以yx用户尝试登录服务器
ssh yx@192.168.1.100
yx@192.168.1.100's password:
Permission denied, please try again.
yx@192.168.1.100's password:
Permission denied, please try again.
yx@192.168.1.100's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
-----登录上服务器后可以用whoami查询当前用户及用ifconfig来确认是服务器的IP---
---复制----
服务器端复制文件给客户机
scp /etc/passwd root@192.168.1.101:/opt/(服务器上打的)
客户机端复制文件给服务器
scp /opt/1111.txt zhangsan@192.168.1.100:/home/zhangsan(客户机上打的)
zhangsan@192.168.1.100's password:
1111.txt 100% 7 0.4KB/s 00:00
服务器端复制文件给客户机
scp zhangsan@192.168.1.100:/home/zhangsan/1.txt /root (客户机上打的)
客户机端复制目录给服务器
scp -r /opt/ zhangsan@192.168.1.100:/home/zhangsan
zhangsan@192.168.1.100's password:
1111.txt 100% 7 0.4KB/s 00:00
passwd 100% 2379 1.3MB/s 00:00
-----客户端的上传和下载(因为sftp服务也在使用22号端口,无须另外设置)-----
sftp zhangsan@192.168.1.100
zhangsan@192.168.1.100's password:
Connected to 192.168.1.100.
sftp> ls
1111.txt opt
sftp> get 1111.txt
Fetching /home/zhangsan/1111.txt to 1111.txt
/home/zhangsan/1111.txt 100% 7 0.4KB/s 00:00
sftp> put initial-setup-ks.cfg
Uploading initial-setup-ks.cfg to /home/zhangsan/initial-setup-ks.cfg
initial-setup-ks.cfg 100% 1963 106.8KB/s 00:00
*****************第二种方式:客户机构建密码对传送给服务器端,以服务器端的账户登录***********
因为这是另外一种方式,因此环境得还原成没有做第一种方式之前的环境,否则会影响测试结果。
实验步骤:
1.客户机创建密码对
su zhangsan ##客户端切到zhangsan用户下
2、
[zhangsan@localhost ~]$ ssh-keygen -t RSA
Generating public/private RSA key pair.
Enter file in which to save the key (/home/zhangsan/.ssh/id_rsa): ####这个地方回车 告诉你创建公钥私钥的保存的地方
Created directory '/home/zhangsan/.ssh'.
Enter passphrase (empty for no passphrase): ###这边是可以创建密码短语,如果不创建,可以时间不需要密码登录
Enter same passphrase again:
Your identification has been saved in /home/zhangsan/.ssh/id_rsa.
Your public key has been saved in /home/zhangsan/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:9PCoky53GC6wQ0K4RSsP1E/u/AywC+rFC1lz9cwMceM zhangsan@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| . . o |
| ... . + . |
|o. .+ ooE |
|+.o. o..*= |
|.* o=. S=o |
|o.B.o+.o |
|.=.=..Bo |
|. =.+.++. |
|.. o +.. |
+----[SHA256]-----+
普通用户加入wheel组
[root@localhost .ssh]#gpasswd -a zhangsan wheel
cd .ssh/ ####进入这个隐藏的文件 下面有2个秘钥 公 私
[zhangsan@localhost .ssh]$ sudo /usr/bin/ls /home/zhangsan/.ssh/
id_rsa id_rsa.pub
2.将公钥对上传至服务器
[zhangsan@localhost .ssh]$ sudo /usr/bin/scp id_rsa.pub root@192.168.1.100:/tmp #将公钥传入 /tmp 下
The authenticity of host '192.168.32.187 (192.168.32.187)' can't be established.
RSA key fingerprint is SHA256:qSPPhKr6A22Jo4XdVdNkHz4OhJtxZU7LUBrsOBonHo4.
RSA key fingerprint is MD5:16:23:35:42:fc:67:df:a2:0f:d2:f2:99:39:d3:a2:4a.
Are you sure you want to continue connecting (yes/no)? yes ###输入yes
Warning: Permanently added '192.168.32.187' (RSA) to the list of known hosts.
root@192.168.1.100's password: ##输入密码
id_rsa.pub 100% 409 871.0KB/s
3.服务器端将上传的公钥导入特定账户的公钥数据库里
公钥文件:~/.ssh/authorized_keys(导入到lisi的公钥数据库)
mkdir /home/lisi/.ssh
[root@localhost ~]# cat /tmp/id_rsa.pub >> /home/lisi/.ssh/authorized_keys
[root@localhost ~]# cat /home/lisi/.ssh/authorized_keys
4.客户机用服务器里的特定账户登录
zhangsan$ssh lisi@192.168.1.100
whoami
lisi
-----另一种密码传递方式-----
ssh-keygen -t rsa
sudo /usr/bin/ssh-copy-id -i /home/zhangsan/.ssh/id_rsa.pub lisi@192.168.1.100
Now try logging into the machine, with: "ssh 'lisi@192.168.1.100'"
and check to make sure that only the key(s) you wanted were added.
验证:
[zhangsan@localhost ~]$ssh lisi@192.168.1.100
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:nDv7Gq7d6spvoFpO6UD4qh8EzUkd+nJaqjX4B/pq3e0.
ECDSA key fingerprint is MD5:f7:a9:0a:36:c2:c4:a2:d7:23:a5:c3:03:0f:d8:7c:56.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.100' (ECDSA) to the list of known hosts.
whoami
lisi
?????注:两种密码的传递方式不一样,第一种用输入的密码是zhangsan自己创建的私钥短语,而第二种方式输入的
密码是对方用户lisi的密码。
------免密登录(无密码)-----------
生成密钥
ssh-keygen -t rsa
上传至别的机器,一般是服务器生成密钥,传给客户机,这样服务器可以免密登录上客户机
ssh-copy-id 192.168.1.100
验证
ssh root@192.168.1.100
-----免密登陆:代理(不安全)--这是有密码的情况下再多打ssh-agent bash,没有就不用了--------------
服务器上打 ssh-keygen -t rsa
服务器上打 ssh-copy-id 192.168.1.100
服务器上打 ssh-agent bash
服务器上打 ssh-add
输入密钥密码
代理成功!无密码直接登陆!
ssh root@192.168.1.100
------TCP Wrappers访问控制---
相当于ACL访问控制列表一样,不过控制的是tcp协议类型的服务
vi /etc/hosts.allow
举例
sshd,vsftpd:192.168.1.* 任意字符 192.168.1.1-192.168.1.254
sshd,vsftpd:192.168.1. 所有 192.168.1.0/24
sshd,vsftpd:192.168.1.? 单个字符 192.168.1.1-192.168.1.9
vi /etc/hosts.deny
举例
sshd,vsftpd:ALL 禁止所有
sshd,vsftpd:192.168.2. 仅禁止192.168.2.0/24