[TOC]

0x00 前言简述

描述: Ubuntu 22.04 LTS 是Canonical于2022年4月21日发布的操作系统,代号为Jammy Jellyfish(果酱水母), 其采用GNOME电源配置文件和流线型工作空间过渡,提高优化图形驱动程序上的桌面帧速率,使用新的加密算法迁移到OpenSSL v3以提高安全性,并且为内存安全的系统级编程添加了Rus。

而又由于CentOS发行版在最近几年时内将不在进行维护更新了,所以为了考虑到系统的安全性、可维护性、以及后期运维成本,我们企业内部在2020年时就已经将ubuntu作为主要的服务器系统,所以在我公司新上的业务系统基本采用debian系的发行版服务器来承载基础应用业务,而使用最多当然是Ubuntu此发行版。

现在 Ubuntu 推出了22.04 , 想到原来每次都需要手动一台一台的进行主机安全加固以符合等保要求,所以了节约工作时间提高工作效率,有更多时间进行学习进步,则需要将将我们公司所使用的系统基线镜像进行更新迭代,编写适用于ubuntu 22.04系统的安全加固脚本,并且总结此篇文章并在文章末尾附上自动化安全加固脚本,谢谢大家支持。

此处我依据在我从前编写的 Ubuntu 20.04 系统安全加固脚本中对其根据最新的22.04版本进行更新了等保相关规定策略,以及更新适用最新版本的 Ubuntu,针对脚本进行结构调整,更加方便大家一起参参与维护,若脚本有Bug请大家发送到我的邮箱 master@weiyigeek.top

想要获取该加固脚本的朋友可以在WX公众号【WeiyiGeek】中回复【ubuntu系统加固】即可获得,或者访问【https://weiyigeek.top/wechat.html?key=ubuntu系统加固


首发地址: https://mp.weixin.qq.com/s/dO1bV0tfXKn4ZmqlMcUrrQ
实践视频https://www.bilibili.com/video/BV1fe4y1o7ov


0x01 加固实践

描述: Ubuntu 22.04 主机系统安全加固的 Ubuntu22.04-InitializeReinforce.sh 脚本相关上的使用说明以及实践。

:book:​ 帮助文档

描述: 本工具集主要针对于 Ubuntu 22.04 、20.04 LTS 操作系统进行安全加固以及系统初始化操作。

:hammer_and_wrench: 脚本说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
root@Ubuntu-Security:/home/ubuntu/Ubuntu# ./Ubuntu22.04-InitializeReinforce.sh
__ __ _ _ _____ _
\ \ / / (_) (_)/ ____| | |
\ \ /\ / /__ _ _ _ _| | __ ___ ___| | __
\ \/ \/ / _ \ | | | | | | |_ |/ _ \/ _ \ |/ /
\ /\ / __/ | |_| | | |__| | __/ __/ <
\/ \/ \___|_|\__, |_|\_____|\___|\___|_|\_\
__/ |
|___/
======================================================================
@ Desc: Ubuntu 22.04 Security Reinforce and System initialization
@ Mail bug reports: master@weiyigeek.top or pull request (pr)
@ Author : WeiyiGeek
@ Follow me on Blog : https://blog.weiyigeek.top/
@ Follow me on Wechat : https://weiyigeek.top/wechat.html?key=欢迎关注
@ Communication group : https://weiyigeek.top/visit.html
======================================================================

Usage: ./Ubuntu22.04-InitializeReinforce.sh [--start ] [--network] [--function] [--clear] [--version] [--help]
Option:
--start Start System initialization and security reinforcement.
--network Configure the system network and DNS resolution server.
--function PCall the specified shell function.
--clear Clear all system logs, cache and backup files.
--version Print version and exit.
--help Print help and exit.

Mail bug reports or suggestions to <master@weiyigeek.top> or pull request (pr).
current version : 1.0

WARNING: 温馨提示:使用前先请配置机器上网环境,若没有配置请在 Ubuntu22.04.conf 文件中进行网络配置.
WeiyiGeek.运行加固脚本

WeiyiGeek.运行加固脚本


:atom_symbol:脚本函数:

描述: 如下脚本将根据参数在 Ubuntu22.04-InitializeReinforce.sh 分别进行调用执行, 也可采用--function参数进行指定调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
❯ grep -r -n  "函数名称" -A 1 *
scripts/os-base.sh:26:# 函数名称: base_hostname
scripts/os-base.sh-27-# 函数用途: 主机名称设置
--
scripts/os-base.sh:55:# 函数名称: ubuntu_mirror
scripts/os-base.sh-56-# 函数用途: ubuntu 系统主机软件仓库镜像源
--
scripts/os-base.sh:126:# 函数名称: ubuntu_software
scripts/os-base.sh-127-# 函数用途: ubuntu 系统主机内核版本升级以常规软件安装
--
scripts/os-base.sh:153:# 函数名称: base_timezone
scripts/os-base.sh-154-# 函数用途: 主机时间同步校准与时区设置
--
scripts/os-base.sh:192:# 函数名称: base_banner
scripts/os-base.sh-193-# 函数用途: 远程本地登陆主机信息展示
--
scripts/os-base.sh:345:# 函数名称: base_reboot
scripts/os-base.sh-346-# 函数用途: 是否进行重启或者关闭服务器
--
scripts/os-clean.sh:27:# 函数名称: system_clean
scripts/os-clean.sh-28-# 函数用途: 删除安全加固过程临时文件清理为基线镜像做准备
--
scripts/os-exceptions.sh:26:# 函数名称: problem_usercrond
scripts/os-exceptions.sh-27-# 函数用途: 解决普通用户定时任务无法定时执行问题
--
scripts/os-exceptions.sh:45:# 函数名称: problem_multipath
scripts/os-exceptions.sh-46-# 函数用途: 解决 ubuntu multipath add missing path 错误
--
scripts/os-network.sh:27:# 函数名称: net_config
scripts/os-network.sh-28-# 函数用途: 主机IP地址与网关设置
--
scripts/os-network.sh:70:# 函数名称: net_dns
scripts/os-network.sh-71-# 函数用途: 设置主机DNS解析服务器
--
scripts/os-optimize.sh:27:# 函数名称: optimize_kernel
scripts/os-optimize.sh-28-# 函数用途: 系统内核参数的优化配置
--
scripts/os-optimize.sh:84:# 函数名称: resources_limits
scripts/os-optimize.sh-85-# 函数用途: 系统资源文件打开句柄数优化配置
--
scripts/os-optimize.sh:115:# 函数名称: swap_partition
scripts/os-optimize.sh-116-# 函数用途: 创建系统swap分区
--
scripts/os-security.sh:27:# 函数名称: sec_usercheck
scripts/os-security.sh-28-# 函数用途: 用于锁定或者删除多余的系统账户
--
scripts/os-security.sh:65:# 函数名称: sec_userconfig
scripts/os-security.sh-66-# 函数用途: 针对拥有ssh远程登陆权限的用户进行密码口令设置。
--
scripts/os-security.sh:131:# 函数名称: sec_passpolicy
scripts/os-security.sh-132-# 函数用途: 用户密码复杂性策略设置 (密码过期周期0~90、到期前15天提示、密码长度至少12、复杂度设置至少有一个大小写、数字、特殊字符、密码三次不能一样、尝试次数为三次)
--
scripts/os-security.sh:166:# 函数名称: sec_sshdpolicy
scripts/os-security.sh-167-# 函数用途: 系统sshd服务安全策略设置
--
scripts/os-security.sh:194:# 函数名称: sec_loginpolicy
scripts/os-security.sh-195-# 函数用途: 用户登陆安全策略设置
--
scripts/os-security.sh:230:# 函数名称: sec_historypolicy
scripts/os-security.sh-231-# 函数用途: 用户终端执行的历史命令记录安全策略设置
--
scripts/os-security.sh:261:# 函数名称: sec_grubpolicy
scripts/os-security.sh-262-# 函数用途: 系统 GRUB 安全设置防止物理接触从grub菜单中修改密码
--
scripts/os-security.sh:304:# 函数名称: sec_firewallpolicy
scripts/os-security.sh-305-# 函数用途: 系统防火墙策略设置, 建议操作完成后重启计算机.
--
scripts/os-security.sh:335:# 函数名称: sec_ctrlaltdel
scripts/os-security.sh-336-# 函数用途: 禁用 ctrl+alt+del 组合键对系统重启 (必须要配置我曾入过坑)
--
scripts/os-security.sh:355:# 函数名称: sec_recyclebin
scripts/os-security.sh-356-# 函数用途: 设置文件删除回收站别名(防止误删文件)(必须要配置,我曾入过坑)
--
scripts/os-security.sh:405:# 函数名称: sec_supolicy
scripts/os-security.sh-406-# 函数用途: 切换用户日志记录和切换命令更改名称为SU(可选)
--
scripts/os-security.sh:425:# 函数名称: sec_privilegepolicy
scripts/os-security.sh-426-# 函数用途: 系统用户sudo权限与文件目录创建权限策略设置
--
scripts/os-service.sh:26:# 函数名称: svc_apport
scripts/os-service.sh-27-# 函数用途: 禁用烦人的apport错误报告
--
scripts/os-service.sh:52:# 函数名称: svc_snapd
scripts/os-service.sh-53-# 函数用途: 不使用snapd容器的环境下禁用或者卸载多余的snap软件及其服务
--
scripts/os-service.sh:75:# 函数名称: svc_cloud-init
scripts/os-service.sh-76-# 函数用途: 非云的环境下禁用或者卸载多余的cloud-init软件及其服务
--
scripts/os-service.sh:101:# 函数名称: svc_debugshell
scripts/os-service.sh-102-# 函数用途: 在系统启动时禁用debug-shell服务
--
scripts/os-software.sh:26:# 函数名称: install_chrony
scripts/os-software.sh-27-# 函数用途: 安装配置 chrony 时间同步服务器
--
scripts/os-software.sh:79:# 函数名称: install_java
scripts/os-software.sh-80-# 函数用途: 安装配置java环境
--
scripts/os-software.sh:110:## 函数名称: install_docker
scripts/os-software.sh-111-## 函数用途: 在 Ubuntu 主机上安装最新版本的Docker
--
scripts/os-software.sh:201:## 函数名称: install_cockercompose
scripts/os-software.sh-202-## 函数用途: 在 Ubuntu 主机上安装最新版本的Dockercompose


​:coffee:​ 配置文件:
描述: 在 Ubuntu22.04.conf 配置文件中定义脚本所需的安全策略以及日志、历史记录存放路径, 以模板的初始密码与防火墙配置等,其中最主要的是一定要配置好IP地址,以成功拉取软件仓库中的工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
$ vim Ubuntu22.04.conf
# Show Script Execute result (Y/N)
VAR_VERIFY_RESULT=Y

# Modify Script vertify timeout (unit s)
VAR_VERIFY_TIMEOUT=5

# Modify Script run time
VAR_RUNDATE=$(date +%Y%m%d-%s)

# Modify Path to logfile.
LOGFILE=/var/log/weiyigeek-${VAR_RUNDATE}.log

# Modify Path to Backup directory.
BACKUPDIR=/var/log/.backup/${VAR_RUNDATE}

# Modify Path to history record directory.
HISTORYDIR=/var/log/.history

# Modify su command execute log file path.
SU_LOG_FILE=${HISTORYDIR}/su.log

# Modify the hostname
VAR_HOSTNAME="Ubuntu-Security"

# Modify the IP/MASK and Gateway
VAR_IP=10.20.172.152/24
VAR_GATEWAY=10.20.172.1

# Modify the DNS server
# DNSPod: 119.29.29.29 Alidns: 223.5.5.5 223.6.6.6
# Google: 8.8.8.8 8.8.4.4 Cloudflare: 1.1.1.1 1.0.0.1
# Internal : Your intranet domain name resolution server
VAR_DNS_SERVER=("223.5.5.5" "223.6.6.6")

# Modify the SSHD server
VAR_SSHD_PORT=20221

# Modify the super user and normal user
# 建议将密码设置最小长度10(最好设置为12以上,等保要求),数字、大写字母、小写字母、特殊符号,密码包含三种及以上, 且无规律。
# 温馨提示: 下面设置的密码为初始密码,在系统登陆后会要求更改。
VAR_SUPER_USER=root
VAR_SUPER_PASS=R2022.weiyigeek.top
# normal user
VAR_USER_NAME=ubuntu
VAR_USER_PASS=U2022.weiyigeek.top
# low privilege application users
VAR_APP_USER=app
VAR_APP_PASS=A2022.weiyigeek.top

# Modify the NTP server
VAR_NTP_SERVER=( "ntp.aliyun.com" "ntp.tencent.com" "192.168.10.254")

# Modify the timezone
VAR_TIMEZONE=Asia/Shanghai

# Modify Password policy
# 默认密码最大使用为90天、过期前15天提示, 密码最小长度为12
PASS_MIN_DAYS=1
PASS_MAX_DAYS=90
PASS_WARN_AGE=15
PASS_MIN_LEN=12
# 默认加密方式为SHA512, 重试次数为3, 新密码与旧密码至少有6个字符不同, 至少包含3种密码类型,不限制密码中包含大写字母、小写字母、数字、特殊符号的最大数量,记住三次旧密码。
VAR_PASS_ENCRYPT=SHA512
VAR_PASS_RETRY=3
VAR_PASS_DIFOK=6
VAR_PASS_MINCLASS=3
VAR_PASS_UCREDIT=-1
VAR_PASS_LCREDIT=-1
VAR_PASS_DCREDIT=-1
VAR_PASS_OCREDIT=-1
VAR_PASS_REMEMBER=3

# 禁止没有主目录的用户登录
VAR_DEFAULT_HOME=no
# 删除用户时禁止同步删除用户组
VAR_USERGROUPS_ENAB=no
# 启用成功登录的日志记录
VAR_LOG_OK_LOGINS=yes

# Modify file or Dirctory privilege policy
VAR_UMASK=022

# Modify user login failed count policy
# 默认在5分钟之内登陆失败次数超过6次将锁定10分钟,终端超时10分钟
VAR_LOGIN_FAIL_COUNT=6
VAR_LOGIN_FAIL_INTERVAL=300
VAR_LOGIN_LOCK_TIME=600
VAR_LOGIN_TIMEOUT=300

# Modify history record count policy
VAR_HISTSIZE=128

# Modify firewall policy tcp or udp port .
VAR_ALLOW_PORT=("22,80,443,${VAR_SSHD_PORT}/tcp" "53/udp")


​:running:​ 脚本使用

  • Step 1.上传到需要加固的主机服务器中,此处我上传到ubuntu用户的家目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    OperatingSystem\Security> scp -r .\Ubuntu\ ubuntu@10.20.172.152:~
    ubuntu@10.20.172.152\'s password:
    Ubuntu22.04.conf 100% 2979 976.9KB/s 00:00
    os-base.sh 100% 14KB 5.4MB/s 00:00
    os-clean.sh 100% 2446 2.1MB/s 00:00
    os-exceptions.sh 100% 2634 2.5MB/s 00:00
    os-info.sh 100% 1169 1.3MB/s 00:00
    os-manual.sh 100% 1860 2.0MB/s 00:00
    os-network.sh 100% 3774 1.8MB/s 00:00
    os-optimize.sh 100% 7752 3.7MB/s 00:00
    os-security.sh 100% 23KB 5.7MB/s 00:00
    os-service.sh 100% 3969 2.0MB/s 00:00
    os-software.sh 100% 8007 3.3MB/s 00:00
    Ubuntu22.04-InitializeReinforce.sh 100% 7989 5.0MB/s 00:00
  • Step 2.登陆服务器并切换到root用户, 查看 /home/ubuntu 目录下上传的加固版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ ssh -p 22 ubuntu@10.20.172.152
ubuntu@Ubuntu-Security:~$ tree Ubuntu/
Ubuntu/
├── Readme.assets
│   ├── image-20220823143235577.png
│   └── image-20220823143354742.png
├── Readme.md
├── Ubuntu22.04-InitializeReinforce.sh
├── config
│   └── Ubuntu22.04.conf
├── example
│   └── 22.04
│   ├── 00-custom-header
│   ├── common-auth
│   ├── common-password
│   ├── issue
│   ├── issue.net
│   ├── login.defs
│   ├── profile
│   ├── resolved.conf
│   ├── sshd_config
│   └── su
└── scripts
├── os-base.sh
├── os-clean.sh
├── os-exceptions.sh
├── os-info.sh
├── os-manual.sh
├── os-network.sh
├── os-optimize.sh
├── os-security.sh
├── os-service.sh
└── os-software.sh

ubuntu@Ubuntu-Security:~$ sudo -i
  • Step 3.切换root用户后进入 /home/ubuntu/Ubuntu,安全加固脚本存放目录,首先将所有的sh文件赋予可执行去那些,其次需要在 Ubuntu22.04.conf 中进行相应配置,最后运行Ubuntu22.04-InitializeReinforce.sh --start即可,最后等待系统重启即可。
1
2
3
cd /home/ubuntu/Ubuntu
chmod +x -R *
Ubuntu22.04-InitializeReinforce.sh --start
WeiyiGeek.运行加固脚本

WeiyiGeek.运行加固脚本

  • Step 4.中途请根据需求输入Y/N,然后等待重启即可,在重启后请注意sshd服务端口更改为20221所以此时你需要指定ssh连接端口。
1
2
ssh -p 20221 ubuntu@10.20.172.152  # Ubuntu22.04.conf 定义的 ubuntu 初始化密码,登陆后会提示你进行更改。
su - root # 只能有ubuntu用户切换到root用户,其它低权限以及app用户无法通过su进行用户切换
WeiyiGeek.加固结果

WeiyiGeek.加固结果

温馨提示: 如果执行到密码更新策略时,选择输入了(N) 否将不会更新其在Ubuntu22.04.conf脚本中定义的密码。

温馨提示:脚本中默认root密码为R2022.weiyigeek.top。

温馨提示: 防火墙策略只开放了80,443,22,20221等端口。


:hammer_and_wrench: 脚本视频演示:

[

企业网络安全-等保2.0主机安全测评之Linux-Ubuntu22.04服务器系统安全加固实践与基线系统制作](http://i2.hdslb.com/bfs/archive/a6739f92517a8cd7b0f0e7bbbd1dd610cdf9ab12.jpg)

企业网络安全-等保2.0主机安全测评之Linux-Ubuntu22.04服务器系统安全加固实践与基线系统制作](http://i2.hdslb.com/bfs/archive/a6739f92517a8cd7b0f0e7bbbd1dd610cdf9ab12.jpg)

温馨提示: 点击上方图像进行观看视频。