[内容] Linux acl 权限

案例目录:

案例一:给某一个文件或目录添加 acl
1.1 给某一个文件或目录添加一个用户的 acl
1.2 给某一个文件或目录添加一个组的 acl
1.3 递归给某一个目录和目录里的所有内容添加一个 acl

案例二:删除某一个文件或目录的 acl
2.1 删除某一个文件或目录一个用户的 acl
2.2 删除某一个文件或目录一个组的 acl
2.3 删除某一个文件或目录的所有 acl
2.4 递归删除某一个文件或目录的 acl
2.5 递归删除某一个文件或目录的所有 acl

案例三:显示某一个文件或目录的 acl

案例四:备份和还原某一个文件或目录的 acl
4.1 备份某一个文件或目录的 acl
4.2 还原某一给文件或目录的 acl

具体的案例:

案例一:给某一个文件或目录添加 acl
1.1 给某一个文件或目录添加一个用户的 acl

# setfacl -m u:zhumingyu:r-x /var

(补充:这里以在 /var 目录上给 zhumingyu 用户设置读和执行的 acl 权限为例)

1.2 给某一个文件或目录添加一个组的 acl

# setfacl -m g:zhumingyu:r-x /var

(补充:这里以在 /var 目录上给 zhumingyu 组设置读和执行的 acl 权限为例)

1.3 递归给某一个目录和目录里的所有内容添加一个 acl

# setfacl -Rm u:zhumingyu:r-x /var

(补充:这里以在 /var 目录上递归给 zhumingyu 组设置读和执行的 acl 权限为例)

案例二:删除某一个文件或目录的 acl
2.1 删除某一个文件或目录一个用户的 acl

# setfacl -x u:zhumingyu /var

(补充:这里以在 /var 目录上删除 zhumingyu 用户的 acl 权限为例)

2.2 删除某一个文件或目录一个组的 acl

# setfacl -x g:zhumingyu /var

(补充:这里以在 /var 目录上删除 zhumingyu 组的 acl 权限为例)

2.3 删除某一个文件或目录的所有 acl

# setfacl -b /var

(补充:这里以在 /var 目录上删除所有 acl 权限为例)

2.4 递归删除某一个文件或目录的 acl

# setfacl -Rx u:zhumingyu:r-x /var

(补充:这里以在 /var 目录上递归删除 zhumingyu 用户的 acl 权限为例)

2.5 递归删除某一个文件或目录的所有 acl

# setfacl -Rb /var

(补充:这里以在 /var 目录上递归删除所有 acl 权限为例)

案例三:显示某一个文件或目录的 acl

# getfacl /var

(补充:这里以显示 /var 目录的 acl 权限为例)

案例四:备份和还原某一个文件或目录的 acl
4.1 备份某一个文件或目录的 acl

# getfacl -R /var > /acl.backup

(补充:这里以备份 /var 目录的 acl 权限为例)

4.2 还原某一给文件或目录的 acl

# setfacl --restore /acl.backup

(补充:这里以还原 /var 目录的 acl 权限为例)

[内容] Linux SELinux 标签的设置

内容目录:

内容一:开启 SELinux 标签
1.1 修改 SELinux 配置文件
1.2 重启系统

内容二:SELinux 的常见特性
2.1 SELinux 特性一:创建的文件或目录会自动继承其父目录的 SELinux 标签
2.1.1 在 /var/www/html/ 目录下新创建 index.html 文件
2.1.2 显示 /var/www/html/ 目录的 SELinux 标签
2.1.3 显示新生成的 /var/www/html/index.html 标签
2.2 SELinux 特性二:移动文件或目录和保留属性复制文件或目录不会改变其 SELinux 标签,普通复制会改变 SELinux 标签
2.2.1 在 /tmp/ 目录下新创建 file1,file2,file3 文件
2.2.2 显示 ls -Zd /tmp/ 目录的 SELinux 标签
2.2.3 显示新创建文件的标签
2.2.4 将 /tmp/file1 复制到 /var/www/html/
2.2.5 将 /tmp/file2 移动到 /var/www/html/
2.2.6 将 /tmp/file2 复制到 /var/www/html/,并使用 -a 选项保留文件属性
2.2.7 显示这些文件的 SELinux 标签

内容三:显示某个文件或目录 SELinux 标签
3.1 显示某个文件 SELinux 标签
3.2 显示某个目录 SELinux 标签
3.3 显示某个进程 SELinux 标签

内容四:显示所有 SELinux 标签
4.1 显示所有文件和目录的 SELinux 标签
4.2 显示所有端口的 SELinux 标签
4.3 显示所有进程的 SELinux 标签

内容五:设置 SELinux 标签
5.1 设置文件和目录 SELinux 标签
5.1.1 使用 semanage fcontext 命令和 restorecon 命令设置文件和目录的 SELinux 标签
5.1.1.1 semanage fcontext 命令的常用选项
5.1.1.2 使用 semanage fcontext 命令和 restorecon 命令设置文件和目录的 SELinux 标签
5.1.1.2.1 使用 smanage fcontext 命令设置 SELinux 标签
5.1.1.2.2 使用 restorecon 命令修改默认上下文
5.1.2 使用 chcon 命令设置 SELinux 标签
5.2 设置端口 SELinux

具体的内容:

内容一:开启 SELinux 标签
1.1 修改 SELinux 配置文件

# vim /etc/selinux/config

将以下内容:

......
SELINUX=disabled
......

修改为:

......
SELINUX=enforcing
......

或者:

......
SELINUX=perssive
......

1.2 重启系统

# reboot

内容二:SELinux 的常见特性
2.1 SELinux 特性一:创建的文件或目录会自动继承其父目录的 SELinux 标签
2.1.1 在 /var/www/html/ 目录下新创建 index.html 文件

# echo website > /var/www/html/index.html

(补充:这里以在 /var/www/html/ 目录下生成 index.html 文件为例)

2.1.2 显示 /var/www/html/ 目录的 SELinux 标签

# ls -dZ /var/www/html/
unconfined_u:object_r:httpd_sys_content_t:s0 index.html

2.1.3 显示新生成的 /var/www/html/index.html 标签

# ls -Z /var/www/html/index.html/index.html 
unconfined_u:object_r:httpd_sys_content_t:s0 index.html

(补充:从内容 1.1.2 和内容 1.1.3 命令的结果可以看出新生成的文件或其父目录的 SELinux 标签一致)

2.2 SELinux 特性二:移动文件或目录和保留属性复制文件或目录不会改变其 SELinux 标签,普通复制会改变 SELinux 标签
2.2.1 在 /tmp/ 目录下新创建 file1,file2,file3 文件

# touch /tmp/file{1,2,3}

2.2.2 显示 ls -Zd /tmp/ 目录的 selinux 标签

# ls -Zd /tmp/
unconfined_u:object_r:user_tmp_t:s0 /tmp/

2.2.3 显示新创建文件的标签

# ls -Z /tmp/file*
unconfined_u:object_r:user_tmp_t:s0 /tmp/file1  unconfined_u:object_r:user_tmp_t:s0 /tmp/file2
unconfined_u:object_r:user_tmp_t:s0 /tmp/file3

2.2.4 将 /tmp/file1 复制到 /var/www/html/

# cp /tmp/file1 /var/www/html/

2.2.5 将 /tmp/file2 移动到 /var/www/html/

# mv /tmp/file2 /var/www/html/

2.2.6 将 /tmp/file2 复制到 /var/www/html/,并使用 -a 选项保留文件属性

# cp -a /tmp/file3 /var/www/html/

2.2.7 显示这些文件的 SELinux 标签

# ls -Z /var/www/html/file*
unconfined_u:object_r:httpd_sys_content_t:s0 file1           unconfined_u:object_r:user_tmp_t:s0 file3
unconfined_u:object_r:user_tmp_t:s0 file2

(补充:从内容 2.2.3 和内容 2.2.7 命令的结果可以看出只有普通复制会改变 SELinux 标签 )

内容三:显示某个文件、目录或进程 SELinux 标签
3.1 显示某个文件 SELinux 标签

# ls -Z <file>

3.2 显示某个目录 SELinux 标签

# ls -Zd <directory>

3.3 显示某个进程 SELinux 标签

# ps -auxZ | grep <process>

内容四:显示所有 SELinux 标签
4.1 显示所有文件和目录的 SELinux 标签

# semanage fcontext -l

(注意:需要单独安装 policycoreutils-python-utils 后才能使用 semanage 命令)

4.2 显示所有端口的 SELinux 标签

# semanage port -l

(注意:需要单独安装 policycoreutils-python-utils 后才能使用 semanage 命令)

4.3 显示所有进程的 SELinux 标签

# ps -auxZ

内容五:设置 SELinux 标签
5.1 设置文件和目录 SELinux 标签
5.1.1 使用 semanage fcontext 命令和 restorecon 命令设置文件和目录的 SELinux 标签
5.1.1.1 semanage fcontext 命令的常用选项

1) -a 添加或变更 SELinux 标签
2) -d 删除 SELinux 标签
3) -l 显示所有的 SELinux 标签
4) -t 指定上下文 SELinux 标签
5) -v 显示修改 SELinux 标签的内容
6) -R 递归设置 SELinux 标签
7) -m 变更 SELinux 标签

5.1.1.2 使用 semanage fcontext 命令和 restorecon 命令设置文件和目录的 SELinux 标签
5.1.1.2.1 使用 smanage fcontext 命令设置 SELinux 标签

# semanage fcontext -a -t httpd_sys_content_t "/tmp(/.*)?"

(补充:这里以将 /tmp(/.*) 的 SELinux 标签设置为 httpd_sys_content_t 为例)

(注意:需要单独安装 policycoreutils-python-utils 后才能使用 semanage 命令)

5.1.1.2.2 使用 restorecon 命令修改默认上下文

# restorecon -Rv /tmp
Relabeled /tmp from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

5.1.2 使用 chcon 命令设置 SELinux 标签

# chcon -t httpd_sys_content_t /tmp/*

(补充:这里以将 /tmp/* 的 SELinux 标签设置为 httpd_sys_content_t 为例)

5.2 设置端口 SELinux

# semanage port -a -t http_port_t -p tcp 82

(补充:这里以将 TCP 82 端口的 SELinux 标签设置为 http_port_t 为例)

(注意:需要单独安装 policycoreutils-python-utils 后才能使用 semanage 命令)

[步骤] CentOS Linux & RHEL 系统的优化 (通过 tuned 实现)

步骤一:系统环境要求

服务器系统要配置好可用的软件源

步骤二:安装 tuned 系统优化软件

# yum -y install tuned

步骤三:显示 tuned 推荐的优化模式

# tuned-adm recommend
virtual-guest

步骤四:切换至 tuned 推荐的优化模式

# tuned-adm profile virtual-guest

步骤五:显示当前的优化模式

# tuned-adm active
Current active profile: virtual-guest

补充:取消 tuned 系统优化的方法

# tuned-adm off

[步骤] 临时文件或目录的自动删除(CentOS Linux & RHEL 版)

步骤一:创建自动清理临时文件或目录的配置文件

# cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
# vim /etc/tmpfiles.d/tmp.conf

将以下内容:

......
q /tmp 1777 root root 10d
......

修改为:

......
q /tmp 1777 root root 5d
......

(补充:这样设置后会将 /tmp 目录下,权限为 1777 超过 5 天的文件或目录删除)

步骤二:自动清理临时文件或目录

# systemd-tmpfiles --clean /etc/tmpfiles.d/tmp.conf 

[实验] Samba 远程共享服务的搭建

纪念:站主于 2020 年 7 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

步骤目录:

步骤一:规划拓扑
1.1 服务器列表
1.2 服务器列表简介

步骤二:系统环境要求

步骤三:在服务端上安装 Samba 服务

步骤四:在服务端上配置 Samba 服务
4.1 在服务端上配置 Samba 服务文件
4.2 在服务端上生成 Samba 服务共享用户
4.2.1 在服务端上生成 Samba 服务共享用户
4.2.2 在服务端上给 Samba 服务共享用户设置系统密码
4.2.3 在服务端上给 Samba 服务共享用户设置 Samba 共享密码
4.2.4 显示 Samba 服务共享用户是否可用
4.3 在服务端上生成 Samba 服务共享目录
4.3.1 在服务端上生成 Samba 服务共享目录
4.3.2 在服务端上给 Samba 服务共享目录设置权限
4.3.3 在服务端上给 Samba 服务共享目录设置所属主和所属组
4.3.4 在服务端上给 Samba 服务共享目录设置 selinux 标签
4.3.5 在服务端上让 Samba 服务共享目录上的 selinux 标签立刻生效

步骤五:启动 Samba 服务并设置为开机自动启动

步骤六:客户端使用服务端 Samba 服务
6.1 在客户端上安装 Samba 客户端软件
6.2 在客户端上测试服务端的 Samba 服务
6.3 在客户端上挂载服务端的 Samba 目录
6.3.1 手动挂载的方法
6.3.2 自动挂载的方法

具体的操作步骤:

步骤一:规划拓扑
1.1 服务器列表

服务端 192.168.101.41
客户端 192.168.101.42

1.2 服务器列表简介

1) 服务器提供 Samba 服务将自己的目录分享
2) 客户端挂载和使用 Samba 服务将服务端分享的目录挂载在自己的目录上

步骤二:系统环境要求

1) 所有服务器的系统都需要是 CentOS 8 版本
2) 所有服务器都要关闭防火墙
3) 所有服务器都要打开 SELinux
4) 所有服务器系统都要配置好可用的软件源
5) 需要按照拓扑图给对应的服务器配置好 IP 地址和主机名
6) 所有服务器都要可以相互 ping 通自己和对方的 IP 地址和主机名

步骤三:在服务端上安装 Samba 服务

(只在服务端上执行以下步骤)

# yum -y install samba

步骤四:在服务端上配置 Samba 服务
4.1 在服务端上配置 Samba 服务文件

(只在服务端上执行以下步骤)

# vim /etc/samba/smb.conf

将全部内容修改如下:

# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
workgroup = WORKGROUP
realm = zhumingyu
netbios name = zhumingyu
#encrypt passwords = yes
map to guest = NEVER
security = user
password server = *
name resolve order = bcast host
restrict anonymous = 2
#null passwords = no
#guest account = smb_nobody
#use spnego = yes
client use spnego = yes
server string = ""
host msdfs = no
msdfs root = no
domain master = no
preferred master = no
local master = no
os level = 0
browse list = no
browseable = no
dns proxy = no
wide links = no
public= no
guest ok = no
hosts deny = ALL EXCEPT 192.168.101.42

[sharetest]
valid users = zhumingyu
write list = zhumingyu
read list = zhumingyu
path = /share
guest ok = no
read only = no
browseable = no
writable = yes
public = no
create mask = 0755
directory mask = 0755


补充:
1) 这里的 workgroup = WORKGROUP 是让 Samba 服务属于 WORKGROUP
2) 这里的 hosts deny = ALL EXCEPT 192.168.101.42 是只让客户端 192.168.101.42 能够访问服务端的 Samba
3) 这里的 sharetest 是这个 Samba 挂载点的名称,挂载这个挂载点的格式就是://192.168.101.41/sharetest
4) 这里的 valid users = zhumingyu 是 Samba 服务共享用户需要手动生成,如果换成让所有的服务共享用户都可以使用则可以写成 valid users = @users
5) 这里的 path = /share 是 Samba 服务共享目录需要手动生成

4.2 在服务端上生成 Samba 服务共享用户
4.2.1 在服务端上生成 Samba 服务共享用户

(只在服务端上执行以下步骤)

# useradd zhumingyu

4.2.2 在服务端上给 Samba 服务共享用户设置系统密码

(只在服务端上执行以下步骤)
# passwd zhumingyu

4.2.3 在服务端上给 Samba 服务共享用户设置 Samba 共享密码

(只在服务端上执行以下步骤)

# smbpasswd -a zhumingyu

4.2.4 显示Samba 服务共享用户是否可用

(只在服务端上执行以下步骤)

# pdbedit -L

4.3 在服务端上生成 Samba 服务共享目录
4.3.1 在服务端上生成 Samba 服务共享目录

(只在服务端上执行以下步骤)

# mkdir /share

4.3.2 在服务端上给 Samba 服务共享目录设置权限

(只在服务端上执行以下步骤)

# chmod 755 /share/

4.3.3 在服务端上给 Samba 服务共享目录设置所属主和所属组

(只在服务端上执行以下步骤)

# chown zhumingyu:zhumingyu /share/

4.3.4 在服务端上给 Samba 服务共享目录设置 SELinux 标签

(只在服务端上执行以下步骤)

# semanage fcontext -a -t samba_share_t '/share(/.*)?'

4.3.5 在服务端上让 Samba 服务共享目录上的 SELinux 标签立刻生效

(只在服务端上执行以下步骤)

# restorecon -RFvv /share/

步骤五:启动 Samba 服务并设置为开机自动启动

(只在服务端上执行以下步骤)

# systemctl enable --now smb

步骤六:客户端使用服务端 Samba 服务
6.1 在客户端上安装 Samba 客户端软件

(只在客户端上执行以下步骤)

# yum -y install samba-client cifs-utils

6.2 在客户端上测试服务端的 Samba 服务

(只在客户端上执行以下步骤)

# smbclient --user=zhumingyu -L //192.168.101.41

或者:

# smbclient //192.168.101.41/sharetest -U zhumingyu
smb: \> ls
smb: \> exit

6.3 在客户端上挂载服务端的 Samba 目录
6.3.1 手动挂载的方法

(只在客户端上执行以下步骤)

# mount -t cifs -o username=zhumingyu,password=1,sec=ntlmssp //192.168.101.41/sharetest /tmp

6.3.2 自动挂载的方法

(只在客户端上执行以下步骤)

# vim /etc/fstable

添加以下内容:

......
# //192.168.101.41/sharetest /tmp cifs defaults,rw,username=zhumingyu,password=1 0 0