@[TOC](第十九章 加密与安全(一))
实验一:Openssl 使用
目的
Openssl 使用基本用法。
前提
系统发行版本 ip地址 主机名
CentOS7 172.20.1.101 node1
CentOS7 172.20.1.102 node2
CentOS7 172.20.1.103 node3
安装openssl软件包:
yum -y install openssl
查询openssl包信息:
rpm -qi openssl
显⽰openssl的⼦命令,随便输⼊⼀个openssl不⽀持的命令,就会提⽰出openssl的命令列表:
标准命令,消息摘要命令,加密命令 openssl help
openssl命令使⽤:
【例1】openssl中对称加密的使⽤ 在node1中使⽤openssl的enc 命令对称加密⽂件file1,为file1.ciper
制作实验用的文件: echo "hello world" > file1 查看没加密前的文件内容: cat file1 加密文件:openssl enc -des3 -a -salt -in file1 -out file1.ciper 根据需要设置密码。 查看加密后的文件: cat file1.ciper
【例2】使⽤openssl⽣成信息摘要,对⽐md5sum 命令⽣成的内容,应该⼀样才对
使用md5进行生产摘要信息: openssl dgst -md5 file1 生成md5摘要信息: md5sum file1 对比验证结果。
【例3】使⽤openssl ⽣成密码 使⽤相同的密码每次秘钥都不⼀样,因为默认使⽤的salt不⼀样:
md5sum file1
openssl passwd -1
输入密码;
openssl passwd -1
输入不一样的密码;两次密码不一样,结果也不同。
说明:
-1表⽰使⽤md5。
现在我们制定以下相同的salt,然后输⼊相同的密码,结果应该⼀样才对:
openssl passwd -1
显示结果: $1xzgK5UKT6$xYzS.oSeUYm4HM35DSiv0.
使用相同salt:openssl passwd -1 -salt zgK5UKT6
输入相同的密码,其结果是一样的。
【例4】使⽤openssl⽣成伪随机内容,以base64格式显⽰
查看帮助: openssl rand help
每次显⽰内容是随机的:
openssl rand -base64 10
0Tbb+AlIrXtOeA==
openssl rand -base64 10
LKPYsGgsHnzLSA==
openssl rand -bae64 10
KYOoC0LMMhMcDA==
【例5】使⽤openssl ⽣成公私钥 ⽣成⼀个rsa的私钥:
(umask 066;openssl genrsa -out private.key 1024)
使⽤des加密过的rsa私钥:
(umask 066;openssl genrsa -out private.key -des 1024)
解密私钥:
openssl rsa -in private.key -out private2.key
使⽤对应的私钥⽣成公钥:
openssl rsa -in private2.key -pubout -out public.key
【例6】使⽤openssl ⽣成ca签署的证书 在node1服务器上的/etc/pki/CA⽬录⽣成rsa私钥:
yum -y install tree
cd /etc/pki/CA
查看目录结构:tree
cd private/
(umask 077; openssl genrsa -out cakey.pem 4096)
⽣成⾃签证书:
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem -days 3650
输入:(国家代码)CN
输入:(所在州省)beijing
输入:(所在城市)beijing
输入:(公司名称)magedu
输入:(部门名称)M35
输入:(用户名或主机名)www.magedu.com
输入:(邮箱地址)可留空,直接回车
根据提示,输入相应信息即可。
查看⾃签证书详细内容:
openssl x509 -in cacert.pem -noout -text
查看⾃签证书简要内容,查看证书有效期:
#颁发者信息
openssl x509 -in cacert.pem -noout -issuer
#证书有效期
openssl x509 -in cacert.pem -noout -dates
【例7】客户端向CA申请证书 在node2服务器中⽣成私钥:
(umask 077; openssl genrsa -out app.key 1024)
在node2中利⽤私钥⽣成ca证书申请请求⽂件:
openssl req -new -key app.key -out app.csr
CN
beijing
beijing
magedu
M35
app.magedu.com
邮件地址为空,直接回车;
根据要求,输入相应信息即可。
将node2的ca请求⽂件发送到node1上:
scp app.csr 172.20.1.101:/root/
在node1的/etc/pki/CA/创建两⽂件:index.txt和serial:
touch /etc/pki/CA/index.txt
echo 0F >/etc/pki/CA/serial
给app.csr签署证书:
openssl ca -in /root/app.csr -out /etc/pki/CA/certs/app.crt -days 100
需要两次输入y。
在node2上使⽤相同的私钥再次⽣成⼀个证书: 在ndoe2中⽣成ca签署请求,并发给node1:
openssl req -new -key app.key -out app2.csr
(输入步骤略)
根据要求,输入相应信息即可。
scp app2.csr 172.20.1.101:/root/
在node1上签署app2的证书签署请求:
openssl ca -in /root/app2.csr -out /etc/pki/CA/certs/app2.crt -days 100
输入2次y。
【例8】证书吊销 在node1中查看签署过的证书,并将10证书吊销:
]# cat /etc/pki/CA/index.txt
显示:
V 220720012755Z 0F unknown /C=CN/ST=beijing/O=magedu/OU=M35/CN=app.magedu.com
V 220720013114Z 10 unknown /C=CN/ST=beijing/O=magedu/OU=M35/CN=app2.magedu.com
#查看指定编号证书状态
]# openssl ca -status 10
10=Valid (V)
]# openssl ca -revoke /etc/pki/CA/newcerts/10.pem
#查看吊销情况
]# cat /etc/pki/CA/index.txt
V 220720012755Z 0F unknown /C=CN/ST=beijing/O=magedu/OU=M35/CN=app.magedu.com
R 220720013114Z 220411013552Z 10 unknown /C=CN/ST=beijing/O=magedu/OU=M35/CN=app2.magedu.com
]# openssl ca -status 10
10=Revoked (R)
在node1中⽣成吊销通知证书:
echo 1F >/etc/pki/CA/crlnumber #注意:第一次更新证书吊销列表前,才需要执行
openssl ca -gencrl -out /etc/pki/CA/crl.pem
cat /etc/pki/CA/crlnumber
openssl crl -in /etc/pki/CA/crl.pem -noout -text
实验二:PAM
目的
- 认识PAM是插件式验证框架,了解各验证模块所在目录及配置文件。 pam 的主配置文件为:/etc/pam.conf, 也可以根据对应的具体应用单独设置配置文件,位置为/etc/pam.d/下。
- 当/etc/pam.d 存在时, /etc/pam.conf 则失效。
安装pam
【例1】安装pam包并查看信息:yum -y install pam
yum info pam.x86_64
【例2】各种验证模块的存放位置:
cd /usr/lib64/security/
ls
【例3】对应模块的配置⽂件存放位置:
cd /etc/security/
ls
实验三:加解密
目的
了解加密、解密的实现过程。
前提
实验环境介绍 系统发行版本 ip地址 主机名 CentOS7 172.20.1.101 node1 CentOS7 172.20.1.102 node2 CentOS7 172.20.1.103 node3
步骤
1、gpg加密软件
yum -y install gnupg2
yum info gnupg2
gnupg2软件包的主要程序和配置⽂件:
rpm -ql gnupg2
【例1】使⽤pgp对某⽂件进⾏加密处理 在node1服务器上编辑⽂件file1.txt,并使⽤gpg加密
echo "hello world" > file1.txt
gpg -c file1.txt
回车后设定⼀个加密⼝令,并确认密码:
⽣成了加密⽂件:file1.txt.gpg 加密后⽂件不可查看到真实内容。
使⽤scp将file1.txt⽂件传输到node2主机:
scp file1.txt.gpg 172.20.1.102:/root/
在node2中解密拷贝过来的file1.txt.gpg:
gpg -o file1.txt -d file1.txt.gpg
输⼊密码:
~]$ cat file1.txt
hello world
【例2】使⽤gpg⽣成公钥 在node1,安装熵池补充服务rng-tools,⽅便实验操作,否则⽣成密码时会卡主:
yum -y install rng-tools
systemctl restart rngd
使⽤ --gen-key ⽣成公私钥:
- 选择加密算法RSA
- 选择RSA秘钥长度
- 选择秘密过期时间
- 填写名称
- 邮箱和备注可以跳过
- 最后选择0 确定
注意:下面建议在真实机上做、需要动鼠标或敲键盘、生成密钥
gpg --gen-key
输入:选择选择key的类型,1为默认表示rsa,直接回车实验默认;
输入:key长度,默认2048,直接回车;
输入:有效期限,默认0表示无期限,直接回车;
输入:确定,y回车;
输入:用户名,maged回车;
输入:邮件地址,留空直接回车;
输入:注释,留空直接回车;
输入:确定或修改,o确定回车;
根据需要,输入相应内容即可。
以下步骤,可⼀直回车完成:
输⼊密码:
确认输⼊的密码:
提⽰要求输⼊安全密码:
提⽰,输⼊密码不安全:
提⽰重新确认:
看⼀下⽣成的密码对,pubring是公钥,secring私钥,这两个⽂件不可以⽤cat直接查看,乱码:
.ngupg⽬录:
[root@node1 ~]# cd .gnupg
[root@node1 .gnupg]# ll
total 28
-rw------- 1 root root 7680 Apr 11 10:27 gpg.conf
drwx------ 2 root root 6 Apr 11 10:27 private-keys-v1.d
-rw------- 1 root root 1166 Apr 11 10:30 pubring.gpg
-rw------- 1 root root 1166 Apr 11 10:30 pubring.gpg~
-rw------- 1 root root 600 Apr 11 10:30 random_seed
-rw------- 1 root root 2468 Apr 11 10:30 secring.gpg
srwxr-xr-x 1 root root 0 Apr 11 10:30 S.gpg-agent
-rw------- 1 root root 1280 Apr 11 10:30 trustdb.gpg
导出公钥到magedu.pubkey
gpg -a --export -o magedu.pubkey
【例3】在node2上使⽤node1的公钥加密数据,然后让node1使⽤私钥解密
拷贝node1的公钥到node2上
scp magedu.pubkey 172.20.1.102:/root/
在node2上使⽤gpg⽣成node2⾃⼰的公私钥对:
#工作中、此步谨慎操作‘rm -rf .gnupg’
rm -rf .gnupg
yum -y install rng-tools
systemctl restart rngd
gpg --gen-key
输入:选择选择key的类型,1为默认表示rsa,直接回车实验默认;
输入:key长度,默认2048,直接回车;
输入:有效期限,默认0表示无期限,直接回车;
输入:确定,y回车;
输入:用户名,laowang回车;
输入:邮件地址,留空直接回车;
输入:注释,留空直接回车;
输入:确定或修改,o确定回车;
根据需要,输入相应内容即可。
查看node2的公钥有哪些,然后将node1的公钥导⼊:
gpg --import magedu.pubkey
使⽤magedu公钥加密file2⽂件,并将加密后的⽂件拷贝到node1中:
echo "ilinux.io" > file2
gpg -e -r maged file2
根据需要,输入相应的内容即可。
scp file2.gpg 172.20.1.101:/root
在node1中解密file2.gpg ⽂件:
.gnupg]# cd
~]# gpg -o file2 -d file2.gpg
~]# cat file2
ilinux.io
【例4】公私钥管理 使⽤命令删除公钥:
gpg --list-keys
#显示:
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/D46705FD 2022-04-12
uid maged
sub 2048R/3AB0F1C3 2022-04-12
pub 2048R/0CC882F0 2019-01-24
uid node2
sub 2048R/CB69EB45 2019-01-24
#删除maged公钥
gpg --delete-keys maged
gpg --list-keys
删除私钥,通过命令只能删除内容不能删除⽂件,最直接的的⽅式直接删除.gnupg目录
gpg --delete-keys maged
输入:确认删除,y
gpg --list-keys
gpg --delete-secret-keys node2
输入:确认删除,y
输入:再次确认删除,y。
或:
rm -rf .gnugp
实验四:sshd服务
目的
理解sshd服务的功能和配置。
前提
centos7系统。
实验步骤
1、ssh服务器端
【例1】查询openssh-server
rpm -qa openssh-server
要想通过ssh链接远程服务器,对方服务器需要安装ssh服务器端程序,并开启对应服务。 CentOS中默认使用的是openssh-server,进程名称为sshd,默认监听的网络端口是22。
【例2】sshd服务有对应的配置⽂件,位置是/etc/ssh/sshd_config
rpm -ql openssh-server
2、修改sshd默认端⼝号
【例3】改sshd服务默认端⼝,为9527然后重启查看状态 修改配置⽂件中的Port 配置参数
vim /etc/ssh/sshd_config
修改为:
Port 9527
systemctl restart sshd #重启sshd服务
#再把端口号改回
vim /etc/ssh/sshd_config
修改为:
#Port 22
systemctl restart sshd #重启sshd服务
【例4】修改监听的ip地址,默认监听本机的所有ip地址,通过修改配置⽂件指定ssh监听在指定的ip地址
给node1主机在添加⼀个ip地址172.20.1.111
ip a a 172.20.1.111/16 dev ens33
ip a
修改ssh的配置⽂件,指定监听的ip地址为172.20.1.111
vim /etc/ssh/sshd_config
修改为:
ListenAddress 172.20.1.111
systemctl restart sshd
ss -tnl
然后使⽤node2或者xshell链接172.20.1.101 链接失败,链接172.16.1.111成功。
7 ~]# ssh 172.20.1.101
ssh: connect to host 172.20.1.101 port 22: Connection refused
7 ~]# ssh 172.16.1.111
root@172.16.1.111's password:
Last login: Tue Apr 12 14:22:14 2022 from 172.16.1.111
6 ~]$
【例5】修改ssh服务监听的⽹络地址类型,默认设any,inet 为ipv4,inet6为ipv6
vim /etc/ssh/sshd_config
修改为:
AddressFamily inet
systemctl restart sshd
ss -tnl
【例6】sshd服务默认需要记录⽇志,默认的⽇志级别为INFO,⽇志存放于/var/log/secure中
vim /etc/ssh/sshd_config
修改为:
SyslogFacility AUTHPRIV
LogLevel INFO
ll /var/log/secure
【例7】关于验证⽅⾯的配置
- LoginGraceTime 指的是登录输入密码的最长时间,2m内容不输入密码,则结束本次链接,0代表不做限制。
- PermitRootLogin 指的是是否允许root远程登录。yes代表允许, no代表不允许。
- StrictModes 指的是在接受登录之前 是否检查文件权限和所有者信息和家目录信息,默认要检查。
- MaxAuthTries 每次登录输入密码错误次数,默认是6次。
vim /etc/ssh/sshd_config
修改为:
LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes
MaxAuthTries 6
MaxSessions 10
【例8】登录验证⽅式
PubkeyAuthentication 是否支持公钥验证方式 PasswordAuthentication 是否支持密码验证方法
vim /etc/ssh/sshd_config
修改为:
PubkeyAuthentication yes
PasswordAuthentication yes
【例9】是否⽀持x11选项,⾮活动时间限制选项
- X11Forwarding 指定是否支持X11转发;
- ClientAliveInterval 非活动时间限制,0为不限制;
- ClientAliveCountMax 指定满足非活动时间次数,因此ClientAlivedInterval乘以ClientAlivedCountMax 的值为最长终非活动时间;
- UseDNS 是否需要域名反解析,建议设置为no 这样可以提高链接速度。
vim /etc/ssh/sshd_config
修改为:
X11Forwarding yes
ClientAliveInterval 0
ClientAliveCountMax 3
【例10】设置ssh登录成功后的提⽰信息 设置banner,后⾯跟上提⽰的⽂本信息
vim /etc/ssh/sshd_config
修改为:
Banner /root/sshbanner.txt
重启sshd,重新链接,提⽰信息出现:
cat sshbanner.txt
Hello
systemctl restart sshd
exit
#用Xshell再次连接、提示信息出现
Type `help' to learn how to use Xshell prompt.
[c:\~]$ ssh 172.20.1.101
Connecting to 172.20.1.101:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Hello #提示信息
Last login: Tue Apr 12 14:41:20 2022 from 172.20.1.7
[root@centos6 ~]$
【例11】设置访问控制⽤户
- AllowUsers 允许登录的用户;
- DenyUsers 不允许登录的用户;
- AllowGroups 允许登录的组;
- DenyGroups 不允许登录的组。
在node1上创建3个⽤户,并配置对应的密码:
#此次密码统一设置为和用户名一致
useradd gordon
passwd gordon
useradd tom
passwd tom
useradd alice
passwd alice
sshd配置⽂件中添加相关的访问控制选项:
vim /etc/ssh/sshd_config
修改为:
AllowUsers gordon tom
DenyUsers tom
AllowGroups alice gordon
DenyGroups alice
/etc/init.d/sshd restart
实际登录测试时,只有gordon可以登录成功,tom和alice再输⼊密码后被拒绝,要求再次输⼊密码;因此,有拒绝的⽤户 和组,肯定会被拒绝。
[root@centos7 ~]# ssh gordon@172.20.1.101
Hello
#密码输入上面创建用户时密码、密码即可登陆
gordon@172.20.1.101's password:
#登陆成功、
[gordon@centos6 ~]$
3、dropbear 编译安装并运⾏
【例12】到dropbear官⽹下载源码包
点击download:
使⽤wget下载源码包:
[root@centos7 ~]# yum -y install wget
[root@centos7 ~]# wget https://matt.ucc.asn.au/dropbear/dropbear-2018.76.tar.bz2
【例13】解压源码包,执⾏配置,编译,安装 编译安装前先安装开发环境:
[root@centos7 ~]# yum -y group install "Development Tools"
安装解压⼯具:
[root@centos7 ~]# yum -y install lbzip2 zlib-devel
解压对应的dropbear软件包:
[root@centos7 ~]# tar xvf dropbear-2018.76.tar.bz2
解压后进⼊⽬录:
[root@centos7 ~]# cd dropbear-2018.76
执行配置
[root@centos7 dropbear-2018.76]# ./configure
执行编译
[root@centos7 dropbear-2018.76]# make
执行安装
[root@centos7 dropbear-2018.76]# make instal
安装结束后使⽤dropbearkey 命令⽣成对应的公私钥:
[root@centos7 dropbear-2018.76]# mkdir /etc/dropbear
[root@centos7 dropbear-2018.76]# dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
使⽤ dropbear -p 9527 启动dropbear服务:
[root@centos7 dropbear-2018.76]# dropbear -p 9527
#查看9527端口
[root@centos7 dropbear-2018.76]# ss -tnl
node2使⽤Xshell链接软件node1服务器成功:
[root@centos6 ~]$ ssh 172.20.1.101 -p 9527
4、AIDE 环境检查⼊侵检测⼯具
【例14】安装aide 并查看软件信息
[root@centos7 ~]# yum -y install aide
[root@centos7 ~]# rpm -qi aide
Name : aide
Version : 0.15.1
Release : 13.el7
Architecture: x86_64
Install Date: Wed 13 Apr 2022 09:00:54 AM CST
Group : Applications/System
Size : 318333
License : GPLv2+
Signature : RSA/SHA256, Thu 10 Aug 2017 10:56:17 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : aide-0.15.1-13.el7.src.rpm
Build Date : Thu 03 Aug 2017 01:00:53 PM CST
Build Host : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://sourceforge.net/projects/aide
Summary : Intrusion detection environment
Description :
AIDE (Advanced Intrusion Detection Environment) is a file integrity
checker and intrusion detection program.
Aide通过扫描对应文件的相关信息,存放到数据库中,后期和在数据库信息进行对比,判断文件是否有变动。 aide的配置文件为/etc/aide.conf, 里面定义了检测的相关信息和对应目录的指定配置规则。 使用 >- aide --init生成信息数据库
>- aide --update 更新数据库
>- aide --check 进行检测比对
在node1服务器上创建/data⽬录,在data中创建dir1⽂件夹和f1⽂件:
[root@centos7 ~]# mkdir -pv /data
[root@centos7 ~]# mkdir -pv /data/dir1
[root@centos7 ~]# echo hello > /data/f1
[root@centos7 ~]# cd /data
然后在aide的配置⽂件最下⾯添加下⾯的配置信息,让其检测/data/⽬录下的内容,不检查dir1下的内容:
[root@centos7 data]#vim /etc/aide.conf
添加:
/data/ CONTENT
!/data/dir1
然后执⾏aide数据初始化:
[root@centos7 data]# aide --init
AIDE, version 0.15.1
### AIDE database at /var/lib/aide/aide.db.new.gz initialized.
然后对f1⽂件进⾏修改, 执⾏检测,发现f1⽂件被篡改:
[root@centos7 data]# cd /var/lib/aide/
[root@centos7 aide]# ll
total 5856
-rw------- 1 root root 5994032 Apr 13 09:05 aide.db.new.gz
[root@centos7 aide]# mv aide.db.new.gz aide.db.gz
[root@centos7 aide]# echo "hello world" > /data/f1
[root@centos7 aide]# aide --check
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2022-04-13 09:07:40
Summary:
Total number of files: 157220
Added files: 0
Removed files: 0
Changed files: 1
---------------------------------------------------
Changed files:
---------------------------------------------------
changed: /data/f1
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /data/f1
SHA256 : WJG1tSLV3whtD/CxEPvZ0hu0/HFjrzTQ , qUiQTy8PR5uPgZdpSzAYSw0u0cHNKh7A
在dir1中创建⽂件, 更新aide数据信息:
[root@centos7 aide]# echo fff > /data/dir1/ss
[root@centos7 aide]# aide --update
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2022-04-13 09:16:09
Summary:
Total number of files: 157220
Added files: 0
Removed files: 0
Changed files: 1
---------------------------------------------------
Changed files:
---------------------------------------------------
changed: /data/f1
---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /data/f1
SHA256 : WJG1tSLV3whtD/CxEPvZ0hu0/HFjrzTQ , qUiQTy8PR5uPgZdpSzAYSw0u0cHNKh7A
修改对应的数据⽂件:
[root@centos7 aide]# rm -rf aide.db.gz
[root@centos7 aide]# mv aide.db.new.gz aide.db.gz
然后修改dir1中的ss⽂件内容,进⾏检测,结果没有发现ss⽂件被修改过,因为在配置⽂件中定义了!/data/dir1:
[root@centos7 aide]# echo sss > /data/dir1/ss
[root@centos7 aide]# aide --check
AIDE, version 0.15.1
### All files match AIDE database. Looks okay!
实验五:ssh端⼝转发
⽬的
理解ssh本地端口转发原理: node1 上开启了ssh本地转发,对应的监听地址和端口是127.0.0.1 9527 node1 通过ssh链接到node2 node2 又通过ssh链接到了node3
node1 上使用非加密的telnet客户端 经过ssh本地的转发后到达node3,实现加密通信。
前提
准备三台虚拟机 系统版本 ,ip地址,主机名 CentOS6 192.168.1.142 node1 CentOS7 192.168.1.143 node2 CentOS7 192.168.1.128 node3
实验步骤
1、本地端⼝转发 【例1】在node1上安装telnet客户端,关闭selinux,情况防⽕墙[root@node1 ~]$ yum -y install telnet
[root@node1 ~]$ setenforce 0
[root@node1 ~]$ iptables -F
【例2】在node3关闭selinux,关闭firewalld并清空规则,安装telnet-server服务并启动
@node3 ~]# systemctl stop firewalld
@node3 ~]# systemctl disable firewalld
@node3 ~]# iptables -F
@node3 ~]# setenforce 0
@node3 ~]# yum -y install telnet telnet-server
@node3 ~]# systemctl start telnet.socket
#查看telnet端口23
@node3 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:6000 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::6000 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 :::23 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
观察23端⼝监听即可。 【例3】在node3上创建alice⽤户
@node3 ~]# useradd alice
@node3 ~]# passwd alice
输入密码2次后即可。
【例4】在node1上使⽤ping 命令ping node3,使⽤telnet 登录node3的alice⽤户
[root@node1 ~]$ ping 192.168.1.128 -c 2
PING 192.168.1.128 (192.168.1.128) 56(84) bytes of data.
64 bytes from 192.168.1.128: icmp_seq=1 ttl=64 time=0.988 ms
64 bytes from 192.168.1.128: icmp_seq=2 ttl=64 time=0.642 ms
--- 192.168.1.128 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1017ms
rtt min/avg/max/mdev = 0.642/0.815/0.988/0.173 ms
[root@node1 ~]$ telnet 192.168.1.128
Trying 192.168.1.128...
Connected to 192.168.1.128.
Escape character is '^]'.
Kernel 3.10.0-957.el7.x86_64 on an x86_64
#输入用户名:alice
node3 login: alice
#输入密码:
Password:
Last login: Wed Apr 13 10:00:50 from ::ffff:192.168.1.128
#验证登录用户
[alice@node3 ~]$ id
uid=1001(alice) gid=1001(alice) groups=1001(alice)
【例5】在node3上配置防⽕墙规则,禁⽌node1链接node3的telnet服务
[root@node3 ~]# iptables -A INPUT -s 192.168.1.142 -j REJECT
[root@node3 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 76 packets, 5660 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 192.168.1.142 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 59 packets, 8320 bytes)
pkts bytes target prot opt in out source destination
【例6】在node1上测试⼀下是否可以ping和telnet链接node3
[root@node1 ~]$ ping 192.168.1.128
PING 192.168.1.128 (192.168.1.128) 56(84) bytes of data.
From 192.168.1.128 icmp_seq=1 Destination Port Unreachable
From 192.168.1.128 icmp_seq=2 Destination Port Unreachable
--- 192.168.1.128 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1015ms
[root@node1 ~]$ telnet 192.168.1.128
结果是拒绝连接,Connection refused。
【例7】在node2 上ping node3并测试ssh 链接node3的alice⽤户
[root@node2 ~]# ping 192.168.1.128
PING 192.168.1.128 (192.168.1.128) 56(84) bytes of data.
64 bytes from 192.168.1.128: icmp_seq=1 ttl=64 time=0.839 ms
64 bytes from 192.168.1.128: icmp_seq=2 ttl=64 time=0.694 ms
^C
--- 192.168.1.128 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1019ms
rtt min/avg/max/mdev = 0.694/0.766/0.839/0.077 ms
[root@node2 ~]# ssh alice@192.168.1.128
输入密码,即可登录。
exit
【例8】在node1上进⾏ssh 本地转发
[root@node1 ~]$ ssh -L 9527:192.168.1.128:23 192.168.1.143
输入:yes
输入密码:
即可登录。
ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.143:22 192.168.1.1:50848
ESTAB 0 0 192.168.1.143:22 192.168.1.143:52530
【例9】再开⼀个node1终端,使⽤telnet 链接node3的alice⽤户
[root@node1 ~]$ telnet 127.0.0.1 9527
输入:alice
输入密码:
uname
验证。
【例10】ssh还有其他选项,-N实现前台程序,Ctrl + C 结束进程
ssh -L 9527:192.168.1.128:23 -N 192.168.1.143
-Nf 实现后台执⾏程序,可以通过kill结束相应进程
ps aux | grep 9527
查到pid为3470
kill -9 3470
ps aux | grep 9527
2、SSH 远程转发 实现原理:node2通过ssh服务连接node1 ,node1 通过127.0.0.1 9527 将信息通过已经建⽴的ssh发给node2, node2拿到信息后直接发给node3的telnet服务,实现ssh远端转发连接。 【例1】在node2上创建ssh远程转发,-Nf实现进程后台运⾏
[root@node2 ~]# ssh -R 9527:192.168.1.128:23 -Nf 192.168.1.142
输入密码:
[root@node2 ~]# ps aux | grep Nf
root 9017 0.0 0.0 182916 1192 ? Ss 14:09 0:00 ssh -R 9527:192.168.37.128:23 -Nf 192.168.37.142
root 9031 0.0 0.0 112708 976 pts/1 S+ 14:10 0:00 grep --color=auto Nf
[root@node2 ~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.37.143:33084 192.168.37.142:22
ESTAB 0 52 192.168.37.143:22 192.168.37.1:52550
【例2】在node1上查看监听端⼝号 9527,使⽤telnet远程连接node3
[root@node1 ~]$ ss -tnl | grep 9527
[root@node1 ~]$ telnet 127.0.0.1 9527
输入:alice
输入密码:
即可,连接完成。
【例3】关闭node2上的ssh远程转发进程,node1 telnet node3 失败
[root@node2 ~]# ps aux | grep 9527
查到pid为1270;
[root@node2 ~]# kill -9 1270
[root@node2 ~]# ss -nt
在node1 telnet node3 失败
[root@node1 ~]$ telnet 127.0.0.1 9527
拒绝连接。
3、SSH动态端⼝转发 【例1】在node3上安装httpd服务,开启httpd服务,编写测试主页index.html
[root@node3 ~]# yum -y install httpd > /dev/null
[root@node3 ~]# echo "<h1>www.google.com</h1>" >/var/www/html/index.html
[root@node3 ~]# systemctl start httpd
[root@node3 ~]# ss -tnl
监听80端口。
[root@node3 ~]# curl 127.0.0.1
<h1>www.google.com</h1>
【例2】测试⼀下node1是否可以访问node3的httpd服务
[root@node1 ~]$ curl 192.168.1.128
显示不能连接到主机,couldn't connect to host
【例3】 在node1上开启ssh的动态端⼝转发,实验curl 访问node3的httpd服务,然后关闭动态端⼝转发功能
[root@node1 ~]$ ssh -D 1000 root@192.168.1.143 -Nf
输入密码;
[root@node1 ~]$ curl --socks5 127.0.0.1:1000 192.168.1.128
可以访问。
ps aux | grep Nf
查看pid为3834
kill 3834
实验六:sudo命令
⽬的
掌握sudo权限的设置,使用visudo 命令配置默认配置/etc/sudoers文件。
基本授权操作:
wang 172.20.121.11=(root) /usr/bin/cat /etc/shadow
被授权用户 登录主机地址=(授权成的用户) 授权的具体命令
被授权用户 user: 命令的发起用户
登录主机 host: 被授权用户所在的主机地址,可以写成ALL
授权成的用户 (runas): 想用哪个用户身份去运行命令
授权命令 command: 想被授权的命令 ,可以写成ALL 即所有命令
-a type 使用指定的 BSD 认证类型
-b 在后台运行命令
-C fd 关闭所有 >= fd 的文件描述符
-E 在执行命令时保留用户环境
-e 编辑文件而非执行命令
-g group 以指定的用户组执行命令
-H 将 HOME 变量设为目标用户的主目录。
-h 显示帮助消息并退出
-i [command] 以目标用户身份运行一个登录 shell
-K 完全移除时间戳文件
-k 无效的时间戳文件
-l[l] command 列出用户能执行的命令
-n 非交互模式,将不提示用户
-P 保留组向量,而非设置为目标的组向量
-p prompt 使用指定的密码提示
-S 从标准输入读取密码
-s [command] 以目标用户身份运行 shell
-U user 在列表时,列出指定用户的权限
-u user 以指定用户身份运行命令(或编辑文件)
-V 显示版本信息并退出
-v 更新用户的时间戳而不执行命令
-- 停止处理命令行参数
前提
- centos7系统;在CentOS7上是 sudo.x86_64,使用yum install sudo命令即可安装。
- sudo 的配置文件为/etc/sudoers, /etc/sudoers.d、/etc/sudoers 为总配置文件,也可以在/etc/sudoers.d/文件夹下单独创建配置文件,实现配置分别管理。
- 可通过/usr/sbin/visudo 对配置文件进行编辑。
- sudo程序的可执行文件为/usr/bin/sudo 有特殊权限位。
实验步骤
- 授权wang⽤户完成 /usr/bin/cat /etc/shadow 【例1】编辑/etc/sudoers ⽂件
#可以用whereis查看命令路径、'如cat: /usr/bin/cat'
[root@node1 ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
root ALL(ALL) ALL
wang 192.168.1.128=(root) /usr/bin/cat /etc/shadow
使用wang用户直接cat /etc/shadow 提示权限不够;
使用sudo cat /etc/shadow 提示输入wang用户密码,然后执行授权操作:
cat /etc/shadow 不能访问;
sudo cat /etc/shadow 输入密码后可访问;
- 授权某个⽤户组的⽤户具有特定权限 【例1】visudo 编辑 配置⽂件/etc/sudoers 配置如下
%wheel ALL=(ALL) ALL
%tom ALL=(ALL) ALL
tom组的⽤户具有所有⽤户的所有命令的权限:
su -l tom
sudo cat /etc/shadow
输入密码即可;
【例3】在/etc/sudoers.d ⽬录下创建授权配置⽂件 tom,并授权成root权限,可执⾏所有命令
cd /etc/sudoers.d/
vim tom
tom ALL=(root) ALL
su -l tom
cat /etc/shadow
拒绝;
sudo cat /etc/shadow
输入密码即可;
对于/etc/sudoers.d 下的授权管理配置⽂件也可以⽤visudo编辑,使⽤-f选项即可:
visudo -f /etc/sudoers.d/tom
visudo 可以加上-c选项进⾏内容格式检查:
visudo -c -f /etc/sudoers.d/tom
- 授权时间限制,默认18000分钟内不⽤再次输⼊密码 【例1】使⽤sudo -V 可以查看⼀下sudo的详细信息
sudo -V
...
-------------------------------------------------------------------------------------------
Authentication timestamp timeout: 18000.0 minutes
#默认18000分钟内不⽤再次输⼊密码
Password prompt timeout: 18000.0 minutes
Number of tries to enter a password: 3
Umask to use or 0777 to use user's: 022
Path to mail program: /usr/sbin/sendmail
Flags for mail program: -t
Address to send mail to: root
Subject line for mail messages: *** SECURITY information for %h ***
Incorrect password message: Sorry, try again.
Path to lecture status dir: /var/db/sudo/lectured
Path to authentication timestamp dir: /var/run/sudo/ts #时间戳路径
-------------------------------------------------------------------------------------------
...
查看⼀下对应⽤户的时间戳⽂件,⽂件内容不可直接查看。
[root@node1 ~]# cd /var/sun/sudo/ts
[root@node1 ts]# ll
total 8
drwx------ 2 root tom 4096 Apr 13 17:26 tom
drwx------ 2 root wang 4096 Apr 13 16:45 wang
[root@node1 ts]# cat tom
88焙ďB3Qou[root@node1 ts]# cat wang
[root@node1 ts]#
- sudoers配置⽂件中的其他配置⽅式
user host=(runas) command
其中user除了使⽤⽤户名外,还可以使⽤#uid代替user还可以使⽤⽤户组名,为了和⽤户名作区分,需要使⽤%groupname,同样使⽤%#gid代替也可以。
【例1】使⽤wang⽤户的uid进⾏授权操作,使⽤tom组id进⾏授权操作 编辑授权配置⽂件:
[root@centos7 ~]# cat /etc/passwd |grep tom
tom:x:1000:1000::/home/tom:/bin/bash
[root@centos7 ~]# cat /etc/passwd |grep wang
wang:x:1003:1003:wang:/home/wang:/bin/bash
[root@centos7 ~]# visudo -f /etc/sudoers.d/test
[root@centos7 ~]# cat /etc/sudoers.d/test
#1003 ALL=(ALL) ALL
%#1000 ALL=(ALL) ALL
进⾏授权验证:
[root@node1 ~]# su -l tom
[tom@node1 ~]$cat /etc/shadow | grep root
cat: /etc/shadow: Permission denied #权限拒绝
[tom@node1 ~]$sudo /etc/shadow | grep root
#输入用户密码、即可查看
[tom@node1 ~]$exit
[root@node1 ~]# su -l wang
[wang@node1 ~]$ cat /etc/shadow | grep root
cat: /etc/shadow: Permission denied #权限拒绝
[wang@node1 ~]$ sudo /etc/shadow | grep root
#输入用户密码、即可查看
[wang@node1 ~]$ exit
- 使⽤sudo时取消输⼊密码过程,在command前加上NOPASSWD 【例1】
[root@node1 ~]# visudo -f /etc/sudoers.d/test
[root@node1 ~]# cat /etc/sudoers.d/test
tom ALL=(ALL) NOPASSWD:ALL
[root@node1 ~]# su -l tom
[tom@node1 ~]$ cat /etc/shadow | grep root
#权限拒绝
[tom@node1 ~]$ sudo cat /etc/shadow | grep root
#取消输⼊密码过程
[tom@node1 ~]$ exit
- 配置⽂件中定义别名
user hosts=(runas) command 配置⽂件中的4个部分都可以使⽤别名替换,别名只能使⽤⼤写字⺟和数字构成,以字⺟开头。
【例1】每种⽂件都有特定的定义⽅法
[root@node1 ~]# cat /etc/sudoers.d/test
User_Alias SYSUSER=tom
Host_Alias SYSHOST=192.168.1.128
Runas_Alias SYSRUNAS=root
Cmnd_Alias SYSCMD=/usr/bin/cat /etc/shadow
SYSUSER SYSHOST=(SYSRUNAS) SYSCMD
[root@node1 ~]# su -l tom
[tom@node1 ~]$ cat /etc/shadow
#权限拒绝
[tom@node1 ~]$ sudo cat /etc/shadow | grep root
#可以查看
【例2】授权时禁⽌直⾏特定的命令,需要再命令前加上!
[root@node1 ~]# visudo -f /etc/sudoers.d/test
[root@node1 ~]# cat /etc/sudoers.d/test
tom ALL=(root) /usr/bin/cat /etc/sudoers.d/test
[root@node1 ~]# su -l tom
[tom@node1 ~]$ cat /etc/shadow
权限拒绝;
[tom@node1 ~]$ cat /etc/gshadow
权限拒绝;
[tom@node1 ~]$ sudo cat /etc/shadow | grep tom
#可以访问
[tom@node1 ~]$ sudo cat /etc/gshadow | grep tom
#可以访问
[tom@node1 ~]$ exit
- 默认⽤户,使⽤sudo是可以使⽤-u 选项制定runas⽤户,不加-u是使⽤默认⽤户 【例1】设置tom为默认⽤户
[root@node1 ~]# cat /etc/sudoers.d/test
Defaults:wang runas_default=tom
wang ALL=(tom,root) ALL
[wang@node1 ~]$ su -l wang
[wang@node1 ~]$ cat /etc/shadow | grep root
#权限拒绝
[wang@node1 ~]$ sudo cat /etc/shadow | grep root
#权限拒绝
[wang@node1 ~]$ sudo -u root cat /etc/shadow | grep root
#可以访问
[wang@node1 ~]$ exit
将tom换成root:
[root@node1 ~]# visudo -f /etc/sudoers.d/test
[root@node1 ~]# cat /etc/sudoers.d/test
Defaults:wang runas_default=root
wang ALL=(tom,root) ALL
[root@node1 ~]# su -l wang
[wang@node1 ~]$ cat /etc/shadow | grep root
#权限拒绝;
[wang@node1 ~]$ sudo -u tom cat /etc/shadow | grep root
#权限拒绝;
[wang@node1 ~]$ sudo cat /etc/shadow | grep root
#可以访问
[wang@node1 ~]$ exit
- 在配置⽂件中使⽤通配符,使⽤时需要注意,有可能有漏洞
【例11】
在命令后⾯加上*号,会出现如下漏洞,未授权查看/etc/shadow,但是却可以查看shadow⽂件
cat /etc/sudoers.d/test
tom ALL=(root) /bin/head -1 /var/log/message*
su -l tom
head -1 /var/log/messages
权限拒绝;
sudo head -1 /var/log/messages
sudo head -1 /var/log/messages /etc/shadow
- 使⽤sudo -l 或者 -ll 查看当前⽤户具有的sudo可执⾏情况
[root@node1 ~]# visudo -f /etc/sudoers.d/test
[root@node1 ~]# cat /etc/sudoers.d/test
tom ALL=(root) /bin/head -1 /var/log/messages
[root@node1 ~]# su -l tom
[tom@node1 ~]$ sudo head -1 /var/log/messages
#可以访问
[tom@node1 ~]$ sudo -l
[tom@node1 ~]$ sudo -ll
[tom@node1 ~]$ exit
- 不执⾏任何命令,将⽤户的免密码时间更新⼀下:sodu -v
[root@node1 ~]# sudo -V | grep authentication
Path to authentication timestamp dir: /var/run/sudo/ts #时间戳路径
Type of authentication timestamp record: tty
[root@node1 ~]# cd /var/run/sudo/ts/
[tom@node1 ~]$ date
[tom@node1 ~]$ su -l tom
[tom@node1 ~]$ sudo -v
[tom@node1 ~]$ exit
[root@node1 ~]# date
- sudo -k
sudo -k 可以重置密码时间为1970年01⽉01⽇, 由于当前时间肯定⼤于这个时间,因此下次执⾏sudo时,需要输⼊密码。
sudo -K 可以删除时间戳⽂件,因此下次执⾏sudo时需要输⼊密码。
ll
su -l tom
sudo -K
exit
su -l tom
sudo head -1 /var/log/messages
exit
ll
- sudo -i -u user有切换⽤户功能,root由此功能, 授权tom⽤户切换到root⽤户
sudo -i -u tom
sudo -i -u root
输入密码;
exit
visodu -f /etc/sudoers.d/test
cat /etc/sudoers.d/test
tom ALL=(root) ALL
su -l tom
sudo -i -u root
输入密码;
exit
exit
- 给⽤户授权编辑sudoers⽂件的权限 使⽤sudoedit 即可
visodu -f /etc/sudoers.d/test
cat /etc/sudoers.d/test
tom ALL=(root) /usr/bin/cat /etc/shadow
su -l tom
sudoedit /etc/sudoers
权限拒绝;
exit
visudo -f /etc/sudoers.d/test
cat /etc/sudoers.d/test
tom ALL=(root) /usr/bin/cat /etc/shadow, sudoedit
su -l tom
sudoedit /etc/sudoers
exit
实验七:tcp wrapper
目的
tcpwrapper实现应用程序的访问控制,如果某个软件使用了libwrap库,则可以通过tcpwrapper对其设置访问控制规则。我们可以使用ldd命令查看某个程序是否依赖libwarp库。
前提
系统发行版本 | ip地址 | 主机名 | |||
CentOS7 | 172.20.1.101 | node1 | |||
CentOS7 | 172.20.1.102 | node2 | |||
实验步骤
- 使⽤ldd验证⼀下 sshd服务是否依赖libwrap库 【例1】可以查看到libwrap库,所有证明sshd服务收tcpwrapper控制
[root@node1 ~]# ldd /usr/sbin/sshd | grep libwrap
tcpwrapper通过/etc/hosts.allow 和 /etc/hosts.deny 的配置实现访问控制功能。
【例2】 通过配置hosts.deny实现拒绝node1主机访问node2主机
先通过node1使⽤ssh链接node2:
[root@node1 ~]# ssh 172.20.1.102
输入密码;
[root@node2 ~]# exit
然后再hosts.deny中添加配置规则拒绝node1的访问:
[root@node2 ~]# vim /etc/hosts.deny
#添加后、会拒绝node1的访问
sshd:172.20.1.101
接着使⽤ssh 从node1访问node2,链接被拒绝:
[root@node1 ~]# ssh 172.20.1.102
ssh_exchange_identification: read: Connection reset by peer
- 通过配置/etc/hosts.deny 实现指定服务的指定⽹络地址的访问控制 【例3】⾸先给node2主机在添加⼀个ipv4地址:
[root@node2 ~]# ip a a 172.20.1.112 dev ens33
[root@node2 ~]# ip a
【例4】配置/etc/hosts.deny⽂件,指定172.16.1.112的地址实现访问控制
[root@node2 ~]# vim /etc/hosts.deny
#添加
sshd@172.20.1.112:172.20.1.101
【例5】使⽤node1 ssh链接node2测试⼀下, 验证成功,访问112地址被拒绝,102地址访问成功
[root@node1 ~]# ssh 172.20.1.102
#输入密码
[root@node2 ~]# exit
[root@node1 ~]# ssh 172.20.1.112
#权限拒绝
【例6】当我们在allow和deny⽂件中配置相同的内容时,allow优先级⾼,执⾏allow的配置规则
[root@node2 ~]# vim /etc/hosts.allow
sshd:172.20.1.101
[root@node2 ~]# vim /etc/hosts.deny
sshd:172.20.1.101
在node1上使⽤ssh访问node2, 访问成功:
[root@node1 ~]# ssh 172.20.1.102
输入密码;
[root@node2 ~]# exit
【例7】同时配置多个服务,服务间使⽤“,”分开即可 在node2上安装telnet服务,然后启动该服务:
[root@node2 ~]# rpm -ql telnet-server
[root@node2 ~]# yum -y install telnet-server
[root@node2 ~]# systemctl start telnet.socket
[root@node2 ~]# ss -tnl
#查看是否有telnet监听端口23
配置hosts.deny⽂件添加telnet:
[root@node2 ~]# vim /etc/hosts.deny
sshd,in.telnetd:172.20.1.101
[root@node2 ~]# vim /etc/hosts.allow
sshd:172.20.1.101
然后验证⼀下 sshd服务访问成功,telnet访问失败:
[root@node1 ~]# yum -y install telnet
[root@node1 ~]# ssh 172.20.1.102
输入密码;
[root@node2 ~]# exit
[root@node1 ~]# telnet 172.20.1.102
输入登录账户:root
输入密码,失败;
【例8】现在客户端的多种写法格式
# 禁止172.20.1.开头的所有ip地址
#sshd:172.20.1.
#禁止172.20.1.0/24 网段内的所有主机(cnetos7支持此种写法)
#ssh:172.20.1.0/24
#禁止172.20.1.0/255.255.255.0网段内的所有地址
#ssh:172.20.1.0/255.255.255.0
#禁止所有ip地址
#ssh:ALL
#禁止不包含.号的主机名的主机访问
#ssh:LOCAL
#禁止所有主机名可以解析的地址
#ssh:KNOW
#禁止不能解析的域名主机
#ssh:UNKNOW
#禁止域名解析和反解析不匹配的主机
#ssh:PARANOID
【例9】配置规则中的EXCEPT⽤法,功能为排除某些内容 在deny⽂件中使⽤EXCEPT:
[root@node2 ~]# vim /etc/hosts.deny
sshd:172.20.1. EXCEPT 172.20.1.103
文件/etc/hosts.allow没有配置;如果有把之前配置删除
使⽤node1登录node2,验证是否可以登录成功:(拒绝登录)
[root@node1 ~]# ssh 172.20.1.102
权限拒绝;
使⽤node3登录node2,验证是否可以登录成功:(登录成功):
[root@node3 ~]# ssh 172.20.1.102
输入密码;
[root@node2 ~]# exit
建议不要在allow和deny中同时组合使⽤逻辑复杂的包含和排除关系。
在allow⽂件中是deny逻辑:
[root@node2 ~]# vim /etc/hosts.allow
sshd:172.20.1. EXCEPT 172.20.1.103 :deny
文件/etc/hosts.deny没有配置;
测试⼀下node1和node3是否可以访问node2:
#node1被拒绝。
[root@node1 ~]# ssh 172.20.1.102
权限拒绝;
#node3 允许ssh链接:
[root@node3 ~]# ssh 172.20.1.102
输入密码;
[root@node2 ~]# exit
【例10】spawn可以实现在配合后调⽤外部功能,⽐如可在调⽤echo,实现⼀个访问记录功能
[root@node2 ~]# mkdir -pv /data/
[root@node2 ~]# vim /etc/hosts.allow
sshd:ALL:spawn echo `date +'%%F %%T'` login from client %c to server %s >> /data/sshd.log
然后使⽤node1 链接⼀次node2主机:
[root@node1 ~]# ssh 172.20.1.102
输入密码;
[root@node2 ~]# exit
查看⼀下,是否有⽇志⽣成:
[root@node2 ~]# cat /data/sshd.log
2022-04-14 11:15:24 login from client 192.168.37.7 to server sshd@192.168.37.8
【例11】配置twist,实现功能替换操作
[root@node2 ~]# vim /etc/hosts.allow
sshd:ALL:twist /bin/echo "400 deny to access, go away!!"
然后在node1上使⽤ssh链接node2: [root@node1 ~]# ssh -v 172.20.1.102 【例12】使⽤tcpdmatch⼯具进⾏配置⽂件测试 实际使⽤过程中,有些配置规则很可能对当前ssh有影响,为了减少这种情况发⽣的⼏率,我们可以在某个实验的⽂件夹中 编写测试配置⽂件,进⾏测试。 在node2服务器的/data⽬录下 创建hosts.deny ⽂件,使⽤tcpdmatch进⾏测试.
mkdir /data
yum -y install tcp_wrappers
cd /data
vim /hosts.deny
sshd:ALL
tcpdmatch -d sshd 172.20.2.101
实验八:ssh命令
⽬的
掌握配置ssh、客户端的使用。
前提
系统版本 ip地址 主机名
CentOS7 192.168.1.143 node2
CentOS7 192.168.1.128 node3
实验步骤
- ssh客户端连接服务器
【例1】在node2上使⽤root⽤户登录node3服务器
输⼊:ssh 192.168.1.128 默认是以ssh客户端发起者的root⽤户⾝份,登录远程node2的root⽤户
[root@node2 ~]# ssh 192.168.1.128
输入:yes
输入密码:
即可登录。
【例2】ssh连接时还有其他选项,-v 显⽰详细登录信息, -p 指定主机的ssh服务端端⼝号 -b指定本地的ip址
[root@node2 ~]# ssh -p 22 -b 192.168.1.143 root@192.168.1.128
输入密码;
即可登录。
- ssh基于公私钥验证是否 是特定客户端
【例4】使⽤node2登录node3的root⽤户是,第⼀次提⽰要确认对⽅是否是⾃⼰想要链接的主机,确认后输⼊yes,然后,输⼊root的密码即可登录成功。登录成功后会在客户端的.ssh路径下创建⼀个known_hosts⽂件,内部保存着远程主机的ip地址和对⽅ssh服务端的公钥信息
[root@node2 ~]#cd .ssh/
[root@node2 .ssh]# cat known_hosts
192.168.1.128 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCgUNOBs3yKLKbYvSXLPsOxvfnQrbawKZavDDjSaQjFeKsf7ckZ7XtSV+7rQu6du4J9StPxjCY5/XLXp2iQE7wM=
【例5】查看⼀下node3 sshd服务的公钥对⽐⼀下,应该是⼀样的
[root@node3 ~]# cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCgUNOBs3yKLKbYvSXLPsOxvfnQrbawKZavDDjSaQjFeKsf7ckZ7XtSV+7rQu6du4J9StPxjCY5/XLXp2iQE7wM=
- 开启服务器node1, 将node3的sshd服务对应的公私钥⽂件拷到node1节点,给node1添加⼀个node3的ip地址, 然后使⽤node2 链接node1,验证⼀下登录时是否有提⽰信息,是否需要输⼊yes
【例5】将node3的配置⽂件拷贝到node1的/data下,拷贝ecdsa_key 和ecdsa_key.pub就好,然后关闭node3服务器
#在node3上:
[root@node3 ~]# cd /etc/ssh/
[root@node3 ~]# scp ssh_host_ecdsa_key node1:/data/
[root@node3 ~]# scp ssh_host_ecdsa_key.pub node1:/data/
[root@node3 ~]# init 0
【例6】将node1中/etc/ssh中对应的两个公私钥⽂件内容替换成/data路径下node3的对应⽂件,然后给node1添加原来 node3的ip地址192.168.1.128
[root@node1 ~]# cat /data/ssh_host_ecdsa_key > /etc/ssh/ssh_host_ecdsa_key
[root@node1 ~]# cat /data/ssh_host_ecdsa_key.pub > /etc/ssh/ssh_host_ecdsa_key.pub
#把MAC、IP地址改成一样的
[root@node1 ~]# ip a a 192.168.1.128 dev ens33
【例7】现在使⽤node2主机连接192.168.1.128 查看、发现ssh报警
[root@node2 ~]# ssh 192.168.1.128
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:Mp/PudXpjODf/xvxl5nLOGFmKNUDYWaTSCF0mRf8+PI.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:1
RSA host key for 192.168.1.128 has changed and you have requested strict checking.
Host key verification failed.
【例8】假如我现在node3[192.168.1.128]主机淘汰、换了新node3[192.168.1.128]设备、现在就想连接
[root@node2 ~]# rm -rf .ssh/known_hosts
[root@node2 ~]# ssh 192.168.1.128
#可以连接
- SSH X 转发
准备两台图形界⾯的服务器
操作系统版本 Ip地址 主机名
CentOS6.9 192.168.37.6 node1
CentOS6.9 192.168.37.5 node2
【例8】在node1上使⽤终端连接node2,连接成功后执⾏gedit命令,报错打不开
【例9】在node1上使⽤终端 加上-X 选项 连接node2 ,再次执⾏gedit命令,成功打开node2的图形化界⾯gedit程序
【例10】使⽤windows中xmanager打开node2的桌⾯系统
打开xmanager中的xstart,输⼊node2的ip地址,选择ssh协议,填⼊root⽤户名
【例11】在命令处选择 ,8GONME(Gonme-session), 如图,点击运⾏
【例12】连接成功,可以远程图形界⾯操作node2了
- ssh 跳转操作
操作系统 ip地址 主机名
CentOS7 192.168.1.145 node1
CentOS7 192.168.1.143 node2
CentOS7 192.168.1.128 node3
【例7】在node3的主机上添加防⽕墙规则,禁⽌node1的ssh访问
[root@node3 ~]# iptables -F
[root@node3 ~]# iptables -A INPUT -s 192.168.1.145 -j REJECT
[root@node3 ~]# iptables -vnL
【例8】测试⼀下node1是否可以ping通node3, 是否可以ssh链接的node3
[root@node1 ~]#ping 192.168.1.128
#ping不通
[root@node1 ~]#ssh 192.168.1.128
#拒绝连接。
【例9】使⽤node1 链接node2,然后再⽤node2链接node3 达到从node1访问node3的⽬的
[root@node1 ~]# ssh 192.168.1.143
#输入密码即可。
[root@node2 ~]# ssh 192.168.1.128
#输入密码即可。
[root@node3 ~]# ip a
#此时显示为node3的IP
【例10】直接在node1上执⾏ssh命令也可以实现通过node2链接node3,如图: 分别输⼊node2,和node3的密码即可成功登录node3服务器
[root@node1 ~]# ssh -t 192.168.1.143 ssh 192.168.1.128
输入143的密码;
输入128的密码;
- 使⽤ssh命令在远程主机上执⾏单条命令后返回结果,然后退出 【例1】使⽤上个试验的node1主机通过ssh在node2上执⾏⼀个ip a 的命令,然后退出,如图:
[root@node1 ~]# ssh 192.168.1.143 'ip a'
root@192.168.1.143's password:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:87:a5:c7 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.143/24 brd 192.168.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe87:a5c7/64 scope link
valid_lft forever preferred_lft forever
[root@node1 ~]#
- SSH基于密码的验证,登录对⽅主机时需要输⼊对⽅对应⽤户的密码才可登录
系统发现版本 IP地址 主机名
CentOS7 192.168.11.117 node1
CentOS7 192.168.11.118 node2
CentOS7 192.168.11.235 node3
【例1】实现基于密码的登录验证⽅式,简单的说就是使⽤对⽅主机⽤户名和密码进⾏登录 使⽤node1 登录node2的root账户,输⼊密码后,即可登录node2服务器的root
ssh root@192.168.11.118
输入:yes
输入密码;
- SSH基于公钥验证,实现免密登录远程主机
在node1主机上⽣成公私钥对,将⽣成的公钥拷贝到node2主机上,让后通过node1;ssh链接node2的对应账户,将不需 要输⼊对⽅的密码就可登录。使⽤主机环境同上。
【例1】在node1主机上使⽤ssh-keygen -t rsa ⽣成公私钥对,执⾏过程中直接按回车键使⽤默认选项即可。然后再 ~/.ssh⽂件夹中查看对应的公钥⽂件
[root@node1 ~]# ssh-keygen -t rsa
【例2】使⽤ssh-copy-id 命令将node1的公钥传送到node2的~/.ssh/authorized_keys⽂件中
ssh-copy-id 192.168.11.118
输入:yes
输入密码;
查看⼀下node2的对应⽂件重的内容是否为node1刚⽣产的公钥信息,内容应该包含node1的公钥。
【例3】在node1上使⽤ssh链接node2主机的root账户。不需要输⼊密码直接登录成功,ssh基于公钥验证的实验 完成
[root@node1 ~]# ssh root@192.168.11.118
Last login: Fri Apr 15 16:33:24 2022 from 192.168.11.117
[root@node2 ~]#
【例4】将node2中的~/.ssh/authorized_keys⽂件清空后,ssh⼜恢复到基于密码验证。 在node2中清空对应⽂件:
[root@node2 ~]# cd .ssh/
[root@node2 .ssh]# echo > authorized_keys
使⽤node1链接node2的root⽤户,提⽰需要输⼊密码:
[root@node1 ~]# ssh root@192.168.11.118
要求输入密码;
【例5】某些业务场景将,需要多的服务器之间相互免密登录,则需要分别拷贝⾃⼰的公钥到对⽅主机的授权⽂件中,实现 起来相对繁琐。这⾥我们可以让所有的服务器使⽤相同的公私钥,这样既可以减少相互拷贝公钥的⼯作量。
在node1上使⽤ssh-keygen -t rsa⽣成公私钥,让后拷贝⾃⼰的公钥到⾃⼰的authorized_keys中,最后将整个~/.shh ⽂件夹拷贝到node2和node3中。
在node1上使⽤ssh-keygen -t rsa⽣成公私钥:
[root@node1 ~]# ssh-keygen -t rsa
在node1上使⽤ssh-copy-id将公钥拷贝到⾃⼰的authorized_keys中:
[root@node1 ~]# ssh-copy-id root@192.168.11.117
输入密码;
查看⼀下node1的公钥和authorized_keys内容是否⼀样。
[root@node1 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1zz+CYa0dHZUuFDPfKB6oMmot2GgcBzQWI/Qly0Wkf3a2q1k3QwricW0pQG9qeTOkzCaGvJJjS0fTUSUPFHKT7+Q4OhTTvTtFsSf4Q8CrYHSCQ1OuyT70AUP9Mxjja5G2fnRYxMUCG4OAjOVaVplSWeKgG1HBJyFrI1Ros1JKuGGDJDO8NV8C7q5dVIyvMBUURmOOKw+kEqfQgRbS6plwkuUeyCcFmos97z/QxxT+yqFoAQKg6MlER3MdxMWJMsAwWWConEUFO8M0+CppdKrm8AOkBAmzZ2nYsMfewhpfldwIiUKAHXcgXtYgSxUevOwQ3i7ptvDmYn976Ry8zXW7 root@node1
[root@node1 ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1zz+CYa0dHZUuFDPfKB6oMmot2GgcBzQWI/Qly0Wkf3a2q1k3QwricW0pQG9qeTOkzCaGvJJjS0fTUSUPFHKT7+Q4OhTTvTtFsSf4Q8CrYHSCQ1OuyT70AUP9Mxjja5G2fnRYxMUCG4OAjOVaVplSWeKgG1HBJyFrI1Ros1JKuGGDJDO8NV8C7q5dVIyvMBUURmOOKw+kEqfQgRbS6plwkuUeyCcFmos97z/QxxT+yqFoAQKg6MlER3MdxMWJMsAwWWConEUFO8M0+CppdKrm8AOkBAmzZ2nYsMfewhpfldwIiUKAHXcgXtYgSxUevOwQ3i7ptvDmYn976Ry8zXW7 root@node1
删除node2和node3中的.ssh ⽂件夹:
[root@node2 ~]# rm -rf .ssh/
[root@node3 ~]# rm -rf .ssh/
拷贝node1的.ssh⽂件到node2和node3的对应位置:
[root@node3 ~]# scp -pr .ssh root@192.168.11.118:/root
[root@node3 ~]# scp -pr .ssh root@192.168.11.235:/root
使⽤node1,node2和node3的root分别登录其他两个服务器root账户,分别登录成功:
在node1上,分别测试:
ssh 192.168.11.118
ssh 192.168.11.235
在node2上,分别测试:
ssh 192.168.11.117
ssh 192.168.11.235
需要输入密码;
在node3上,分别测试:
ssh 192.168.11.117
ssh 192.168.11.118
- 由于ssh基于公钥验证的⽅式依赖于公私钥,因此私钥的安全性需要的到保障,可以通过加密私钥的⽅法提⾼安全性
对已⽣成的私钥进⾏加密,使⽤ssh-keygen -p 实现。删除node2的.ssh⽬录,重新拷贝node1的公钥到node2的 authorized_keys 中,然后使⽤node1登录node2时,需要输⼊node1私钥的密码才能登录
【例1】
[root@node1 ~]# ssh-keygen -p
根据需要输入即可;
10、每次登录都需要输⼊私钥的密码,使⽤起来⽐较繁琐。我们可以使⽤ ssh-agent bash 和ssh-add 对私钥 密码在本次回话中托管。减少输⼊私钥密码的次数
【例1】安装psmisc软件包,查看当前ssh回话状态
[root@node1 ~]# yum -y install psmisc
[root@node1 ~]# pstree |grep ssh
|-sshd---sshd---bash-+-grep
然后使⽤ssh-agent bash 开启⼀个bash:
[root@node1 ~]# ssh-agent bash
[root@node1 ~]# pstree | grep ssh
|-sshd---sshd---bash---bash-+-grep
| `-ssh-agent
在新开启的bash中执⾏ssh-add 并输⼊私钥密码。然后连接node2,成功连接不需要输⼊密码:
[root@node1 ~]# ssh-add
根据需要输入即可;
[root@node1 ~]# ssh 192.168.11.118
- 基于公钥的登录⽅式在Xshell中实现
【例1】在windows中使⽤Xshell客户端⼯具⽣成公私钥对
点击xshell的⼯具,选择新建⽤户秘钥向导:
在弹出的对话框中选择rsa加密算法和秘钥长度,点击下⼀步:
⽣成秘钥后点击下⼀步:
给秘钥起⼀个名称,根据需要决定是否需要设置私钥密码。然后点击下⼀步:
将公钥⽂件复制出来,点击完成,然后将公钥写⼊到node1的authorized_keys中:
cat .ssh/authorized_keys
在Xshell中新建⼀个连接,填写对应的ip地址和端⼝号:
选择⽤户⾝份验证,⽅法选择publickey,然后输⼊⽤户名,选择之前⽣成的⽤户密码,最后点击确定:
⽣成会话后点击连接,测试⼀下是否不需要输⼊root密码即可登录成功:
Xshell基于公钥验证的登录⽅式验证成功,直接登录上了, 不需要输⼊root密码:
- 脚本实现拷贝公钥,登录主机
【例1】创建⼀个简单的shell脚本,完成基于公钥的密码登录
cat sshkeyau.sh
#!/bin/bash
rpm -q expect &> /dev/null || yum -y install expect
ssh-keygen -P "" -f "/root/.ssh/id_rsa"
userpwd="123456"
while read ipaddr;do
expect <<EOF
set timeout 10
spawn ssh-copy-id $ipaddr
expect {
"yes/no" {send "yes\n"; exp_continue}
"password" {send "$userpwd\n"}
}
expect eof
EOF
done < ip.txt
cat ip.txt
192.168.11.118
192.168.11.235
执⾏脚本 bash sshkeyau.sh:
rm -rf .ssh
bash sshkeyau.sh
使⽤node1 链接node2主机,验证脚本是否运⾏正常:
ssh 192.168.11.118
exit
实验九:scp命令
目的
scp: secure copy (remote file copy program) ,scp 命令功能为 远程文件拷贝。
常用的选项有:
- -p 保留文件原因权限
- -q静默模式工作
- -c压缩文件
- -P指定远程端口号
- -r 递归复制所有内容
前提
系统发行版 ip地址 主机名
CentOS7 172.20.1.101 node1
CentOS7 172.20.1.102 node2
CentOS7 172.20.1.103 node3
安装了openssh-clients。
实验步骤
- scp 命令的使⽤,scp命令是ssh-client软件包的⼀个命令
rpm -ql openssh-clients
【例1】将node1服务器上的/data/下的所有内容 拷贝到node2主机的/data/⽬录下
[root@node1 ~]# ll /data/
total 0
-rw-r--r-- 1 root root 0 Apr 15 19:48 1.txt
-rw-r--r-- 1 root root 0 Apr 15 19:48 2.log
-rw-r--r-- 1 root root 0 Apr 15 19:48 3.sh
[root@node1 ~]# scp -pr -P 22 /date/ root@172.20.1.102:/data/
拷贝成功。
- rsync
常用的选项有: -v 显示复制过程, -r递归复制目录树, -p保留原文件权限, -t保留原文件时间戳, -g保留组信息, -o保留所有者权限, -l 将软连接文件本身进行复制, -L复制软连接文件只想的文件。 -a 存档,相当于-rlptgoD,但不保留-ACL(-A),和selinux属性(-X)
【例1】rsync 远程同步⽂件程序,需要安装rsync软件包,基本描述信息如下
yum -y install rsync
yum info rsync
【例2】node1的/data/下的所有⽂件拷贝到 node2的/root/data/⽂件夹下
rsync -arv /data/ 172.20.1.102:/data/
查看node2的/data/ 下是否有对应的⽂件。
[root@node2 ~]# ls /data/
1.txt 2.log 3.sh
现在删除/data⽬录下的1.txt和2.log⽂件,
[root@node2 ~]# cd /data/
[root@node2 data]# rm -rf 1.txt 2.log
然后在node1服务器再次执⾏之前的同步命令:
[root@node1 ~]# rsync -arv /data/ 172.20.1.102:/data/
root@172.20.1.102's password:
sending incremental file list
./
1.txt
2.log
sent 152 bytes received 53 bytes 82.00 bytes/sec
total size is 0 speedup is 0.00
发现他只同步了刚才删除的⽂件。
现在在对node2中/data/⽂件中的1.txt 进⾏清空操作:
[root@node2 ~]# cd /data/
[root@node2 data]# echo > 1.txt
然后再次在node1中执⾏刚才的同步命令,发现只对network-functions⽂件进⾏同步。这两个实验操作证明rsync只对有差异的⽂件进⾏同步,效率⽐较⾼。
[root@node1 ~]# rsync -arv /data/ 172.20.1.102:/data
root@192.168.37.7's password:
sending incremental file list
1.txt
sent 110 bytes received 37 bytes 42.00 bytes/sec
total size is 0 speedup is 0.00
- sftp 同样是openssh-clients软件包的⼀个命令,可以⽤ftp的⽅式访问对⽅服务器 【例1】
sftp 172.20.1.101
sftp> mget sshkeyau.sh
sftp> exit
- pssh命令 pssh是⼀个python编写的远程执⾏命令⼯具,可在多个机器上同时执⾏名,和复制⽂件。 【例1】在node1上使⽤pssh命令获取node2主机的主机名
[root@node1 ~]# pssh -H "172.20.1.102" -A -i hostname
【例2】在node1上编写主机地址⽂件ip.txt, 同时获取对应主机的hostname ⾸先使⽤node1分别登录登录node2和node3,这样就不⽤输⼊验证的yes; 然后执⾏命令 同时获取node2和node3的hostname:
[root@node1 ~]# ssh 172.20.1.103
exit
[root@node1 ~]# ssh 172.20.1.102
exit
执⾏命令,输⼊密码,成功获取node2和node3的主机名。
[root@node1 ~]# pssh -h ip.txt -A -i hostname
上述中每次都要输⼊对应主机的密码,⽐较⿇烦,现在设置基于公钥验证,⾸先进⾏免密配置:
[root@node1 ~]# ssh-copy-id 172.20.1.102
[root@node1 ~]# ssh-copy-id 172.20.1.103
然后在node1中测试⼀下免密登录node2 和 node3,最后执⾏命令,获取node2和node3主机名成功:
ssh 172.20.1.103
exit
ssh 172.20.1.102
exit
pssh -h ip.txt -i hostname
在此基础上实现修改node2和node3的selinux配置⽂件功能:
⾸先查看node2和node3的selinux 配置⽂件:
[root@node2 ~]# grep SELINUX= /etc/selinux/config
[root@node3 ~]# grep SELINUX= /etc/selinux/config
然后执⾏pssh命令实现统⼀修改SELINUX=disabled:
[root@node1 ~]# pssh -h ip.txt 'sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config'
查看⼀下node2和node3的配置⽂件是否修改成功:
[root@node2 ~]# grep SELINUX= /etc/selinux/config
[root@node3 ~]# grep SELINUX= /etc/selinux/config
还可以执⾏脚本完成:
[root@node1 ~]# cat test.sh
#!/bin/bash
echo $HOSTNAME
[root@node1 ~]# chmod +x test.sh
使⽤pscp拷贝到node2和node3的/root/下:
[root@node1 ~]# pscp.pssh -h ip.txt test.sh /root/
[root@node1 ~]# pssh -h ip.txt -i /root/test.sh
- 使⽤pslurp 命令下载远程主机的⽂件到本地
在node1中执⾏命令,下载node2中/etc/hostname⽂件,到node的/root路径下,并起名为nodename:
[root@node1 ~]# pslurp -H 172.20.1.102 -L /root/ /etc/hostname nodename
[root@node1 ~]# cd 172.20.1.102/
[root@node1 ~]# ls
[root@node1 ~]# cat nodename