1. openssh服务简介
openssh是基于ssh协议开发的软件。用于在远程系统上安全运行shell。如果您在可以提供ssh服务的远程Linux系统中拥有账户,ssh是为创建在应用层和传输层基础上的安全协议。ssh命令也可以远程去连接其他用户。现在的ssh用的是sshv2版本,因为sshv1有致命的缺陷
常见的远程的连接工具有:
- telnet //这是个大多数情况是应用在网络方面的远程登录协议,23端口的/tcp
- ssh //这是应用层的协议,这是一种安全性较高的运程登录的协议。
安全性高的原因有三:1.通信过程是加密的,先通过主机认证;2.用户认证过程也是加密的,接着才是这个用户认证;3.数据传输过程是加密的 - dropbear //是一种嵌入式的Linux系统专门的ssh服务器端和客户端工具
ssh的认证方式有两种:
- 一是基于口令认证也就是我们通常所说的密码认证
- 二是基于密钥认证
openssh的工作模式
openssh是基于C/S架构进行工作的。
服务端的配置文件目录:/etc/ssh/sshd_config
客户端的配置文件目录:/etc/ssh/ssh_config
脚本启动文件:/etc/init.d/sshd
生成密钥的命令:ssh-keygen
将生成的密钥传给客户端:ssh-copy-id 后面接主机的IP
自定义ssh的配置
通常情况下openssh是不需要配置或修改的,但是为了提供安全性和其他的功能,可以在/etc/ssh/sshd_config这个配置文件中进行修改
PermitRootLogin 的yes和no这两个选项的意思是是否允许root用户远程登录系统
PermitRootLogin without-password 的意思是仅允许root用户基于密钥方式远程登录
PasswordAuthentication 的yes和no选项的意思是是否启用密码身份验证,默认开启
配置基于ssh密钥的身份验证
用户通过公钥身份验证进行ssh登录身份验证。ssh允许用户使用私钥公钥进行身份验证。所以这就说明系统会生成私钥和公钥这个两个,在使用ssh-kengen命令生成的密码。将会生成/.ssh/id_rsa和公钥/.ssh/id_rsa.pub。
生成的ssh密钥将存储在家目录下的.ssh/目录下。
注意私钥的权限是600、公钥的权限是644,而.ssh目录权限必须是700
使用ssh需要注意的安全事项
- 密码要经常更改并且保证复杂性,这样可以提高安全
- 不要使用默认的22号端口
- 仅监听特定的IP地址
- 禁止管理员直接登录
- 使用基于密钥的认证
- 不要使用空密码
- 不要使用sshv1版本,前面已经提到过了,因为sshv1版本有致命的缺陷。这里的缺陷就是不能防范中间人的攻击,所谓的中间人就是有一个人或者一台服务器冒充真正的服务器来接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。这样就会到之数据泄露
- 设定空闲会话超时时长,也样也是保证安全性的一种做法
- 利用好防火墙的规则设置ssh的访问策略
- 限制ssh的访问日的并发和频率
- 做好日志备份
2. openssh的使用
示例:
两台主机分别是192.168.182.140、192.168.182.139
[root@node4 ~]# ssh 192.168.182.139
The authenticity of host '192.168.182.139 (192.168.182.139)' can't be established.
ECDSA key fingerprint is SHA256:G/8pjXUdCVHue8/6maNtVjIyTZ2YeIYY2+eSKXJYYaw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes //这个地方是主机认证必须输入yes才能进行下面的连接操作
Warning: Permanently added '192.168.182.139' (ECDSA) to the list of known hosts.
[email protected]'s password: //这里输入192.168.182.139主机的密码也就是要连接的远程主机的密码
Last login: Fri Sep 24 19:57:16 2021 from 192.168.182.1
[root@node3 ~]#
当上面的命令成功之后便会在192.168.182.139主机的.ssh/目录下生成一个名为known_hosts的文件,这里面记录了远程连接到这台主机的指纹信息
使用用户名去远程连接
这里因为已经做过一次主机认证了所以就不需要做了,主机认证只用做一次
[root@node4 ~]# ssh [email protected]
[email protected]'s password:
Last login: Fri Sep 24 21:05:38 2021 from 192.168.182.1
这里可以在要远程连接的主机后面跟上一条命令,就可以获取到远程主机上这条命令执行的结果
[root@node4 ~]# ssh [email protected] 'ls'
[email protected]'s password:
all.sql
anaconda-ks.cfg
m.sh
passwd
w.sh
x.sh
year.sh
ssh主机密钥生成
这里的-t是加密算法
[root@node4 ~]# ssh-keygen -t rsa
[root@node4 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): //生成密钥后存放的位置
Enter passphrase (empty for no passphrase): //是否设置密码
Enter same passphrase again: //这个地方是让你再次输入密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:o9o0ZeKH+H41JvN5rmUynqDlMl8hKbGOxJHKD/WcYxw root@node4
The key's randomart image is:
+---[RSA 3072]----+
| |
| . |
| + E |
| . + = = . |
| + o @ S . |
| + * Ooo+. |
| + B +*+oo |
| =o*.+o*. |
| ..==o ++. |
+----[SHA256]-----+
成功之后会生成两个密钥文件
[root@node4 .ssh]# pwd
/root/.ssh
[root@node4 .ssh]# ls | grep -w id_rsa
id_rsa
id_rsa.pub
将生成的公钥传给要远程连接的主机使用下面的命令,之后再连接139主机就不需要输入密码了
[root@node4 ~]# ssh-copy-id [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
远程传送和下载文件
scp命令的常用选项有:
-r 递归复制
-p 保持文件的权限
-P 端口
-q 静默模式
-a 全部复制,复制指定目录下的所有文件
将文件file传送到远程主机上
[root@node4 ~]# ls
anaconda-ks.cfg file m.sh w.sh x.sh year.sh
[root@node4 ~]# scp file 192.168.182.139:/root
file 100% 0 0.0KB/s 00:00
[root@node3 ~]# ls
all.sql anaconda-ks.cfg file m.sh w.sh x.sh year.sh
将远程主机上的文件传到本地
[root@node3 ~]# ls | grep -w file2
file2
[root@node4 ~]# scp 192.168.182.139:/root/file2 ./
file2 100% 0 0.0KB/s 00:00
[root@node4 ~]# ls | grep -w file2
file2
生成复杂密码
A-Za-z0-9?意思是密码包含这里面的任意一个字母数字或符号这里的?可以替换成其他的
head -c 20意思是生成20位的随机密码
[root@node4 ~]# tr -dc A-Za-z0-9? < /dev/urandom | head -c 20 | xargs
g9auFc7sltcBLj?cA1CS
这个命令也可以生成随机密码
[root@node4 ~]# openssl rand -base64 10
FvGptFAILt8+vQ==
设定空闲会话超时时长
[root@node4 ~]# vim /etc/bashrc
[root@node4 ~]# source /etc/bashrc
[root@node4 ~]# head -5 /etc/bashrc
# /etc/bashrc
export TMOUT= //这里写超时的时间,默认是以秒为单位
# System wide functions and aliases
# Environment stuff goes in /etc/profile
ssh日志存放目录
[root@node4 log]# ls | grep -w secure //安全日志
secure
secure-20210718
secure-20210924
[root@node4 log]# ls | grep -w messages //
messages
messages-20210718
messages-20210924
[root@node4 log]# pwd
/var/log
可以查看访问日志
[root@node4 log]# tail -f /var/log/secure
1. NFS服务
- NFS是Network File Sysytem的缩写,即网络文件系统。一种使用于分散式文件协定,功能是通过网络让不同的机器、不同的操作系统能够分享个人数据,让应用程序通过网络可以访问位于服务器次磁盘中的数据。
- NFS在文件传送或信息传送过程中,依赖于RPC协议。RPC在使用过程中调用客户端能够执行其他系统中程序的一种机制。
- 在NFS的应用中,本地的NFS的客户端应用可以透明地读写位于NFS服务器上的文件,就像访问本地文件一样。
- NFS适用于Linux于Unix之间进行文件共享,不能实现Linux于windows
间的文件共享 - NFS是运行在应用层都协议,其监听于2049/tcp和2049/udp套接字上
- NFS服务只能基于IP进行认证
2. NFS的应用场景
- 多个主机共享一台CDROM或设备。这对于在多台机器中安装软件来说更加便宜与方便
- 在大型网络中,配置一台中心NFS服务器用来放置所有用户的home目录可能会带来便利。在这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。
- 不同客户端可在NFS上观看影视文件,节省本地空间
- 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下
3. NFS的工作原理
(1)NFS系统是通过网络来进行数据传输的,所以必定会使用端口来进行网络传输。NFS的传输的端口是随机选择的,并且通过RPC协议来实现客户端的协调。因为NFS是基于RPC来进行网络文件系统共享的,下面我们就来聊一下RPC协议
(2)RPC协议又称为远程调用服务。由于NFS支持的功能很多,而且不同的功能都会使用不同的程序来进行启动,每开启一个功能就需要使用一个端口来进行数据的传输。这就导致了NFS的功能所对应的端口无法固定,而需要使用一些随机的且没有被使用的小于1024的端口号来进行数据的传输。常规的服务所使用的端口号是:0~65535,1024以下的是系统服务。
(3)客户端若想要准确的获得NFS服务所使用的端口号,就需要RPC服务。NFS RPC最主要的功能是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口号和功能对应的信息传递给请求数据的NFS客户端,让客户端可以链接到正确的端口号上去,从而实现数据传输。
(4)那么问题来了NFS是怎么知道NFS的每个端口号的呢?
那是因为当NFS服务启动时会随机取用数个端口,并主动向RPC服务注册取用的相关端口信息,这样,RPC服务就可以知道每个端口所对应的NFS功能了,然后RPC服务使用固定的端口号111来监听NFS客户端提交的请求,并将正确的NFS端口打印给NFS客户端,这样就可以让NFS客户端与服务端进行数据传输了。
注意:服务端需要NFS服务和RPC服务,并且需要先启动RPC服务,客户端只需要RPC服务即可
下面是NFS的goon工作原理流程图:
4. NFS的四进程
- nfsd nfs的守护进程,监听在2049/tcp和2049/udp端口上
- idmapd 实现用户账号的集中映射,把所有的账号都映射为NFSNOBODY,但是在访问时却能以本地用户的身份去访问
- mountd 用于验证客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问,反之拒绝访问。
mountd的服务端口是随机的,由rpc服务提供随机端口号 - portmapper NFS服务器的rpc服务,其监听于111/tcp和111/udp套接字上,用于管理远程过程调用(RPC)
5. exports文件格式
nfs的主配置文件时/etc/exports,在此文件中,可以定义NFS系统的输出目录、访问权限和允许访问的主机等。该文件默认为空,没有配置输出任何共享目录,这时基于安全性的考虑,如此及时系统启动了NFS服务也不会输出任何的共享资源。
exports文件中提供了一个共享目录的设置,其命令格式为:
<输出目录> [客户端1(选项1,选项2,)] [客户端2(选项1,选项2,) ]
除输出目录时必须参数外,其他参数均是可选项。另外,格式中的输出目录和客户端之间、客户端和客户端之间都使用空格分隔,但是客户端于选项之间不能有空格。
客户端指的是网络可以访问的NFS共享目录的计算机。客户端的指定非常的灵活,可以是单个主机的IP或域名,也可以是某个域中的某个网段
客户端常规指定的方式:
客户端 | 说明 |
---|---|
192.168.182.139 | 指定IP地址的主机 |
192.168.182.0/24或192.168.182.* | 指定某个网段的所有主机 |
www.xxhh.com | 指定域名的主机 |
*.xxhh.com | 指定xxhh域中的所有主机 |
* | 所有主机 |
设置共享目录的访问权限、用户映射。exports文件中的选项比较多,一般分为三类:
- 访问权限选项,这是用于控制共享目录的访问权限
- 用户映射选项
默认情况下,当客户端访问MFS服务器时,若远程访问的用户时root用户,则NFS服务会将其映射成一个本地的匿名用户(nfsnobody),并将其所属的用户组也映射成匿名用户组此组也是nfsnobody,如此一来就可以提高系统安全性。
访问权限的选项:
访问权限选项 | 说明 |
---|---|
ro | 设置输出目录为只读 |
rw | 设置输出目录为可读写 |
用户映射选项:
用户映射选项 | 说明 |
---|---|
all_squash | 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody) |
no_all_squash | 不将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(默认) |
root_squash | 将root用户及所属的组都映射为匿名用户和用户组 |
no_root_squash | 不将root用户及所属的组都映射为匿名用户和用户组 |
anonuid=xxx | 将远程访问的所有用户都映射为匿名用户,并指定该匿名用户为本地用户账号(UID=xxx) |
anonugid | 将远程访问的所有用户都映射为匿名用户组,并指定该匿名用户组为本地用户组(GID=xxx) |
常用的其他选项:
其他选项 | 说明 |
---|---|
secure | 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认) |
insecure | 允许客户端从大于1024的TCP/IP端口连接NFS服务器 |
sync | 将数据同步写入内存缓冲区或磁盘中,效率低,但是可保证数据一致性 |
async | 将数据先保存在内存缓冲区中,必要时才写入磁盘 |
wdelay | 检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认) |
no_wdelay | 若有写的操作则立即执行,应与sync配置使用 |
subtree_check | 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认) |
no_subtree_check | 即使输出的目录是一个子目录,NFS服务也不检查其父目录的权限,可以效率 |
nohide | 若将一个目录挂载到另一个目录上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需要hide选项 |
5. nfs服务配置与管理
nfs安装:
客户端和服务端都需要安装
[root@node4 ~]# yum -y install nfs-utils.x86_64
[root@node4 ~]# systemctl start rpcbind.service nfs-utils
服务端启动服务的顺序是先启动rpcbind这个服务,再启动nfs-server这个服务
使用showmount命令测试NFS服务器的输出目录状态
-a 显示指定NFS服务器的所有客户端主机以及其连接的目录
-d 显示指定的NFS服务器中已被客户端连接的所有输出目录
-e 显示指定的NFS服务器上所有输出的共享目录
客户端挂载时可以使用的特殊选项:
rsize:其值是从服务器读取的字节数。默认为1024.若使用比较高的值,如8192,可以提高传输速度
wsize:其值是写入到服务器的字节数。默认为1024.若使用比较高的值,如2192,可以提高传输速度
exports 维护exports文件导出的文件系统表的专用工具
-a 输出/etc/exports文件中所设置的所有目录
-r 重新读取/etc/exports文件中的设置,并使器立即生效,无需重启服务
-v 在输出目录时将目录显示到屏幕上
案列:
1.手动搭建一个nfs服务器要求:
- 开放/nfs/shared目录,供所有用户查阅资料
- 开放/nfs/upload目录192.168.182.0/24网段的数据上传目录,并将所有用户及所属的用户都映射为nfs-upload,其UID与GID均为300
这里我们的node4为服务端,node3为客户端,服务端IP为192.168.182.140,客户端IP为192.168.182.139
[root@node4 ~]# mkdir -p /nfs/shared
[root@node4 ~]# cat /etc/exports
/nfs/shared *(ro)
[root@node3 ~]# showmount -e 192.168.182.140
Export list for 192.168.182.140:
/nfs/shared *
永久挂载
[root@node3 ~]# tail -1 /etc/fstab
192.168.182.140:/nfs/shared /mnt nfs defaults,_netdev 0 0
[root@node3 ~]# mount -a
然后到服务端的/nfs/shared目录下创建一个文件用来测试
[root@node4 shared]# touch 123
[root@node4 shared]# pwd
/nfs/shared
发现权限是只读
[root@node3 mnt]# ls
123
[root@node3 mnt]# ll
总用量 0
-rw-r--r-- 1 root root 0 9月 25 21:22 123
第二题
[root@node4 nfs]# pwd
/nfs
[root@node4 nfs]# mkdir upload
创建用户uid为300,gid为300
[root@node4 nfs]# useradd -u 300 nfs-upload
[root@node4 nfs]# groupmod -g 300 nfs-upload
更改/nfs/upload的属主和属组
[root@node4 nfs]# cat /etc/exports
/nfs/shared *(ro)
/nfs/upload 192.168.182.0/24 (rw,anonuid=300,anongid=300)
修改nfs-upload用户对upload的权限
[root@node4 nfs]# setfacl -m u:nfs-upload:rwx /nfs/upload
永久挂载
[root@node3 mnt]# tail -2 /etc/fstab
192.168.182.140:/nfs/shared /mnt nfs defaults,_netdev 0 0
192.168.182.140:/nfs/upload /hello nfs defaults,_netdev 0 0
[root@node3 mnt]# mount -a
[root@node4 upload]# ll
总用量 0
-rw-r--r-- 1 nfs-upload nfs-upload 0 9月 25 22:34 1
[root@node4 upload]# pwd
/nfs/upload
创建一个文件进行测试
[root@node3 hello]# touch 1
[root@node3 hello]# ll
总用量 0
-rw-r--r-- 1 300 300 0 9月 25 22:34 1
[root@node3 hello]# pwd
/hello