[内容] Linux 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 显示 /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 服务器列表

服务端 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

(补充:这里以创建用户 zhumingyu 为例)

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

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

# passwd zhumingyu

(补充:这里以给 zhumingyu 设置密码为例)

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

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

# smbpasswd -a zhumingyu

(补充:这里以给 zhumingyu 用户设置 Samba 共享密码为例)

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

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

# pdbedit -L

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

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

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

# mkdir /share

(补充:这里以创建目录 /share 为例)

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

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

# chmod 755 /share

(补充:这里以给 /share 目录设置 755 权限为例)

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

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

如果是 CentOS Linux & RHEL:

# chown zhumingyu:zhumingyu /share

如果是 openSUSE & SLE:

# chown zhumingyu:users /share

(补充:这里以将 /share 目录的所属主设置成 zhumingyu 为例)

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

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

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

(补充:这里以给 /share 目录打上 samba_share_t SELinux 标签为例)

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

(补充:这里以通过用户 zhumingyu 测试 IP 地址 192.168.101.41 的 /sharetest Samba 共享目录为例)

6.3 在客户端上挂载服务端的 Samba 目录

6.3.1 手动挂载的方法

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

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

(补充:这里以通过用户 zhumingyu 密码为 1,目录权限为 0755,文件权限为 0755,挂载 IP 地址 192.168.101.41 的 /sharetest Samba 共享目录到本地的 /tmp 目录为例)

(注意:用户和密码不能一样,否则会报错)

6.3.2 自动挂载的方法

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

# vim /etc/fstable

添加以下内容:

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

(补充:这里以通过用户 zhumingyu 密码为 1,目录权限为 0755,文件权限为 0755,挂载 IP 地址 192.168.101.41 的 /sharetest Samba 共享目录到本地的 /tmp 目录为例)

(注意:用户和密码不能一样,否则会报错)

[娱乐] Shell 菜单

介绍

基本信息

作者:朱明宇
名称:菜单
作用:提供一个可以供用户进行选择的菜单

使用方法

1. 给此脚本添加执行权限
2. 执行此脚本

脚本

#!/bin/bash

while true
do
        echo
        echo '====== Optional Item ======'
        echo '1.choose CentOS'
        echo '2.choose RHEL'
        echo '3.choose openSUSE'
        echo '4.choose SUSE'
        echo '*.Enter other keys to exit'
        echo
        read -p 'Which one do you want to choose ? ' choose

        case $choose in
        1)
                echo
                echo
                echo '=========  Result ========='
                echo 'You have choosed CentOS'
                echo ;;
        2)
                echo
                echo
                echo '=========  Result ========='
                echo 'You have choosed RHEL'
                echo ;;
        3)
                echo
                echo
                echo '=========  Result ========='
                echo 'You have choosed openSUSE'
                echo ;;
        4)
                echo
                echo
                echo '=========  Result ========='
                echo 'You have choosed SUSE'
                echo ;;
        *)
                exit 1 ;;
        esac
done