├── .gitignore ├── CentOS7-InitializeSecurity.sh ├── README.md ├── Ubuntu └── Ubuntu-InitializeSecurity.sh ├── linux_adduser.sh ├── linux_change_sshport.sh └── 某测评员等保测评指导书(参考) ├── MySQL-等保测评指导书.txt └── linux-centos等保测评指导书.txt /.gitignore: -------------------------------------------------------------------------------- 1 | /centos_config_setting.sh 2 | -------------------------------------------------------------------------------- /CentOS7-InitializeSecurity.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # @Author: liyanjing,@E-mail: 284223249@qq.com, @wechat: Sd-LiYanJing 4 | # @CreateTime: 2022-10-18 10:30 , @Last ModifiedTime: 2022-12-03 13:50 5 | # @Github: https://github.com/919927181/linux-initialization.git 6 | # @Version: 3.6 7 | # @用途:适用于企业内部 CentOS7 系列服务器初始化、系统安全加固 8 | # @参考:https://github.com/WeiyiGeek/SecOpsDev/tree/master/OS-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Linux 9 | # @问题:若设置了用户登陆超时,需要执行 source /etc/profile时,报错 -bash: TMOUT: readonly variable,解决 vi /etc/profile将#export TMOUT #readonly TMOUT 注释掉。 10 | ## ----------------------------------------- ## 11 | # @包含: 12 | # 13 | # [0] 创建SWAP交换分区(默认2G) 14 | # [1] 设置网卡静态IP和DNS(按引导输入ip\子网掩码\默认网关) 15 | # + <11> 全局配置DNS 16 | # + <12> 判断能不能上网 17 | # [2] 在线设置国内yum源,在线yum安装常用软件(htop\ncdu比du性能强\...) 18 | # [3] 系统优化、安全加固等一键设置: 19 | # + <31> 系统的最大文件打开数限制,系统内核参数优化(含关闭ipv6) 20 | # + <32> 时区设置为东8区 21 | # + <33> 禁用ctrl+alt+del重启系统、定义回收站目录等 22 | # + < > 系统安全加固(等保三级-操作系统检查项)如下: 23 | # ++ <35> 用户口令策略(密码过期90天、到期前15天提示、密码长度至少15等) 24 | # ++ <36> GRUB 安全设置 25 | # ++ <37> ssh安全加固设置 26 | # ++ <38> 设置或恢复重要目录和文件的权限 27 | # ++ <39> 开启防火墙、禁用SELINUX等更多设置,然后重启主机 28 | # [4] 更改ssh端口号(等保要求不使用22端口,缺省时改为40107) 29 | # [5] 创建一个拥有管理权限的普通用户(uudocker),执行sodu命令时需要输入密码 30 | # [6] 禁止或允许root用户远程登陆(等保要求禁止root远程登陆,正解:普通用户登陆后su root) 31 | # [7] 强制用户在下次登录时更改密码 32 | # [8] 使用Chrony配置主机时间同步(根据环境需要,可选项) 33 | # [9] 禁用与设置系统中的某些服务(根据环境需要,可选项) 34 | # [10] 清空回收站内容 and 询问你删除回收站功能吗?(执行rm误删时,它可拯救你) 35 | # 36 | # 以下脚本,仅供参考: 37 | # Os_Kernel_Upgrade 推荐"离线升级系统内核" 38 | # disk_Lvsmanager 磁盘LVS逻辑卷添加与配置\033[32m 39 | ## --------------------------------------------- ## 40 | # 41 | 42 | ## 全局变量定义 43 | SSH_PORT=40107 44 | 45 | # 创建拥有管理权限的普通用户名 46 | user_name="uudocker" 47 | # 用户密码,注意特殊字符问题,单引号中的任何字符都只当作是普通字符 48 | user_passwd='zRM8B%Ka!5Fh%Out' 49 | group_name="docker" 50 | 51 | # [SNMP配置] 52 | SNMP_user=liyanjing 53 | SNMP_group=group_snmp 54 | SNMP_view=view_snmp 55 | # 密码 dont use public 56 | SNMP_password='110.c0m' 57 | SNMP_ip=127.0.0.1 58 | 59 | # [备份目录] 60 | BACKUPDIR=/data/back/system 61 | if [ ! -d ${BACKUPDIR} ];then mkdir -vp ${BACKUPDIR}; fi 62 | # [记录目录] 63 | HISDIR=/var/log/.history 64 | if [ ! -d ${HISDIR} ];then mkdir -vp ${HISDIR}; fi 65 | 66 | EXEC_TIME=$(date +%Y%m%d-%m%S) 67 | 68 | ## 公共方法-全局Log信息打印函数 69 | ## 参数: $@ 70 | log_err() { 71 | printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[31mERROR: $@ \033[0m\n" 72 | } 73 | log_info() { 74 | printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[32mINFO: $@ \033[0m\n" 75 | } 76 | log_warning() { 77 | printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[33mWARNING: $@ \033[0m\n" 78 | sleep 5 79 | } 80 | 81 | ## 公共方法-验证否为数字 82 | function isValidNum() { 83 | 84 | local num=$1 85 | local ret=1 86 | 87 | if [ "$num" -gt 0 ] 2>/dev/null ;then 88 | echo "$num is number." 89 | ret=0 90 | else 91 | echo "$num not a number!" 92 | ret=1 93 | fi 94 | 95 | return $ret 96 | } 97 | 98 | ## 公共方法-校验IP地址合法性 99 | function isValidIp() { 100 | local ip=$1 101 | local ret=1 102 | 103 | if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}$ ]]; then 104 | ip=(${ip//\./ }) # 按.分割,转成数组,方便下面的判断 105 | [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] 106 | ret=$? 107 | else 108 | echo "IP format error!" 109 | ret=1 110 | fi 111 | return $ret 112 | } 113 | 114 | ## 公共方法-检查能否上网 115 | function internetCheck() 116 | { 117 | #超时时间 118 | local timeout=1 119 | 120 | #目标网站 121 | local target=www.baidu.com 122 | 123 | #获取响应状态码 124 | local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1` 125 | 126 | if [ "x$ret_code" = "x200" ]; then 127 | #网络畅通 128 | return 1 129 | else 130 | #网络不畅通 131 | return 0 132 | fi 133 | 134 | return 0 135 | } 136 | 137 | ## 公共方法-设置DNS 138 | function setDNS() 139 | { 140 | log_info "[-] DNS域名解析服务设置..." 141 | # DNS服务器地址 142 | DNSIP=("114.114.114.114" "223.5.5.5" "8.8.8.8" "8.8.4.4" ) 143 | cp -a /etc/resolv.conf ${BACKUPDIR}/resolv.conf.bak 144 | for dns in ${DNSIP[@]};do 145 | egrep -q "^nameserver .*${dns}$" /etc/resolv.conf && sed -ri "s/^nameserver.*${dns}$/nameserver ${dns}/" /etc/resolv.conf || echo "nameserver ${dns}" >> /etc/resolv.conf 146 | done 147 | 148 | log_info "[*] restarting Network........." 149 | service network restart && ip addr 150 | 151 | log_warning "\nDNS域名解析服务设置完毕,请ping下百度试试吧..."; 152 | } 153 | 154 | ## 名称: Os_Swap 155 | ## 用途: Liunx 系统创建SWAP交换分区(默认2G) ,无论物理内存多大,都统一设置成2G即可 - 请按需调用执行 156 | ## 参数: $1(几G) 157 | Os_Swap() { 158 | 159 | # 创建虚拟分区文件 160 | if [ -e $1 ];then 161 | sudo dd if=/dev/zero of=/var/swap bs=1024 count=2048000 # 2G Swap 分区 1024 * 1024 , centos 以 1000 为标准 162 | else 163 | number=$(echo "${1}*1024*1024"|bc) 164 | sudo dd if=/dev/zero of=/swapfile bs=1024 count=${number} 165 | fi 166 | 167 | # 启用swap 168 | sudo mkswap /var/swap && mkswap -f /var/swap && sudo swapon /var/swap 169 | 170 | # 设置swap文件永久有效 171 | if [ $(grep -c "/var/swap" /etc/fstab) -eq 0 ];then 172 | sudo tee -a /etc/fstab <<'EOF' 173 | /var/swap swap swap default 0 0 174 | EOF 175 | fi 176 | 177 | sudo swapon --show && sudo free -h 178 | } 179 | 180 | 181 | ## 名称: Os_YumSource_Aliyun 182 | ## 用途: 设置yum阿里源。设置yum源的三种方式:本地源、阿里云在线yum源和远程访问yum源 183 | ## 参数: 无 184 | Os_YumSource_Aliyun() { 185 | 186 | log_info "[*] CentOS 软件仓库镜像源配置&&初始化更新... " 187 | 188 | internetCheck 189 | if [ $? -eq 0 ];then echo -e "\033[31m主机无法上网,请检查网络设置!\n\033[0m" && exit 2; fi 190 | 191 | mkdir -p /etc/yum.repos.d/back 192 | cp -a /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/back/CentOS-Base.repo 193 | 194 | curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 195 | curl -o /etc/yum.repos.d/CentOS-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 196 | sed -i "s#mirrors.cloud.aliyuncs.com#mirrors.aliyun.com#g" /etc/yum.repos.d/CentOS-Base.repo 197 | sed -i "s#mirrors.aliyuncs.com#mirrors.aliyun.com#g" /etc/yum.repos.d/CentOS-Base.repo 198 | 199 | # 代理方式设置 200 | # curl -x 192.168.12.215:3128 -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 201 | # tee -a /etc/yum.conf <<'EOF' 202 | # proxy=http://192.168.12.215:3128/ 203 | # EOF 204 | 205 | rpm --import http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 206 | # 清除并建立新缓存,然后更新 207 | yum clean all && yum makecache 208 | yum --exclude=kernel* update -y && yum upgrade -y && yum -y install epel* 209 | 210 | } 211 | 212 | 213 | ## 名称: Os_Yum_Install_Software 214 | ## 用途: 安装常用的软件\工具 215 | ## 参数: 无 216 | Os_Yum_Install_Software() { 217 | 218 | # 编译软件 219 | yum install -y gcc gcc-c++ g++ make jq libpam-cracklib openssl-devel bzip2-devel 220 | # 常规软件 221 | yum install -y nano vim git unzip wget ntpdate dos2unix net-tools policycoreutils-python 222 | yum install -y tree htop ncdu nload sysstat psmisc bash-completion fail2ban nfs-utils chrony lsof 223 | # 清空缓存和已下载安装的软件包 224 | yum clean all 225 | 226 | log_info "[*] Software configure modifiy successful!Please Happy use........." 227 | } 228 | 229 | 230 | ## 名称: Os_Optimizationn 231 | ## 用途: 操作系统优化设置(内核参数) 232 | ## 参数: 无 233 | Os_Optimizationn() { 234 | 235 | log_info "[-] 正在进行操作系统内核参数优化设置......." 236 | 237 | # (1) Linux 系统的最大进程数和最大文件打开数限制 238 | # 修改用户级的限制,先删除掉以前设置的,然后再在# End 上面增加以下内容 239 | sed -i '/^*/d' /etc/security/limits.conf 240 | sed -i "/# End/i * soft nofile 102400" /etc/security/limits.conf 241 | sed -i "/# End/i * hard nofile 102400" /etc/security/limits.conf 242 | sed -i "/# End/i * soft nproc 102400" /etc/security/limits.conf 243 | sed -i "/# End/i * hard nproc 102400" /etc/security/limits.conf 244 | 245 | # (2) 系统内核参数的配置 246 | log_info "[-] 系统内核参数的配置 " 247 | # sysctl -p报错 sysctl: nf_conntrack_xxxx: No such file or directory 248 | conntrack_str=$(lsmod | grep conntrack) 249 | if [[ "$conntrack_str" = "" ]]; then 250 | modprobe ip_conntrack 251 | fi 252 | 253 | cat > /etc/sysctl.d/99-sysctl.conf << EOF 254 | # sysctl settings are defined through files in 255 | # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. 256 | # 257 | # Vendors settings live in /usr/lib/sysctl.d/. 258 | # To override a whole file, create a new file with the same in 259 | # /etc/sysctl.d/ and put new settings there. To override 260 | # only specific settings, add a file with a lexically later 261 | # name in /etc/sysctl.d/ and put new settings there. 262 | # 263 | # For more information, see sysctl.conf(5) and sysctl.d(5). 264 | 265 | #inotify的watch数量,默认值8192 266 | fs.inotify.max_user_watches=8192000 267 | #aio最大值,默认值65536 268 | fs.aio-max-nr=1048576 269 | #系统级别的打开文件描述符的最大值,默认值98529,是指所有进程的最大文件打开数 270 | fs.file-max = 1048575 271 | #单用户进程最大文件打开数 272 | fs.nr_open = 1048575 273 | 274 | #关sysrq功能 275 | kernel.sysrq = 0 276 | #core文件名添加pid作为扩展名 277 | kernel.core_uses_pid = 1 278 | #修改消息队列长度 279 | kernel.msgmnb = 65536 280 | kernel.msgmax = 65536 281 | #设置最大内存共享段大小bytes 282 | kernel.shmmax = 68719476736 283 | kernel.shmall = 4294967296 284 | #centos7上默认值是30,在Centos6上是60,当内存使用100-10=90%,就开始出现有交换分区的使用 285 | vm.swappiness=10 286 | 287 | net.ipv4.tcp_max_tw_buckets = 6000 288 | net.ipv4.tcp_sack = 1 289 | net.ipv4.tcp_window_scaling = 1 290 | 291 | #内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,4KB,可用命令# getconf PAGESIZE 查看 292 | #8T内存机器,建议用以下参数: 293 | #net.ipv4.tcp_mem = 94500000 915000000 927000000 294 | #第一个数字表示,当 tcp 使用的 page 少于 94500000 时,kernel 不对其进行任何的干预,建议=系统内存*50%*50% 295 | #第二个数字表示,当 tcp 使用了超过 915000000 的 pages 时,kernel 会进入 “memory pressure” 压力模式,建议=系统内存*50%*70% 296 | #第三个数字表示,当 tcp 使用的 pages 超过 927000000 时(相当于3536GB内存),就会报:Out of socket memory,建议=系统内存的50% 297 | #8GB内存机器,TCP连接最多约使用4GB内存),524288*4096/1024/1024/104=2GB,2.7GB,4GB,建议用以下参数: 298 | #net.ipv4.tcp_mem = 524288 699050 1048576 299 | #256GB内存机器,TCP连接最多约使用128GB内存,建议用以下参数: 300 | net.ipv4.tcp_mem = 16777216 22369600 33554432 301 | 302 | #为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte 303 | #4GB,TCP内存能容纳的连接数,约为 4096MB/16KB = 256K = 26万 304 | #48GB,TCP内存能容纳的连接数约为300万 305 | net.ipv4.tcp_rmem = 10240 87380 12582912 306 | net.ipv4.tcp_wmem = 10240 87380 12582912 307 | net.core.wmem_default = 8388608 308 | net.core.rmem_default = 8388608 309 | net.core.rmem_max = 16777216 310 | net.core.wmem_max = 16777216 311 | net.core.somaxconn = 262144 312 | 313 | #每个网络接口接收数据包速率比内核处理这些包的速率快时,允许送到队列数据包的最大数目,网络设备的收发包的队列大小 314 | net.core.netdev_max_backlog = 262144 315 | #最大孤儿套接字(orphan sockets)数,单位是个,每个孤儿socket占用64KB空间 316 | #注意:当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时,就会报:Out of socket memory 317 | #每个孤儿socket可占用多达64KB内存,此时占用内存 3276800/2*64KB/1024=102400MB=100GB 318 | net.ipv4.tcp_max_orphans = 3276800 319 | #未收到客户端确认信息的连接请求最大值 320 | net.ipv4.tcp_max_syn_backlog = 262144 321 | net.ipv4.tcp_timestamps = 0 322 | 323 | #内核放弃建立连接之前发送SYNACK包数量 324 | net.ipv4.tcp_synack_retries = 1 325 | #内核放弃建立连接之前发送SYN包数量 326 | net.ipv4.tcp_syn_retries = 1 327 | 328 | #开SYN洪水攻击保护,防范DDOS攻击,防止SYN队列被占满 329 | net.ipv4.tcp_syncookies = 1 330 | 331 | net.ipv4.tcp_fin_timeout = 1 332 | ##keepalive启用时,TCP发送keepalive消息的频度缺省是2小时 333 | ##nginx做反向代理,为了快速释放链接,超时时间配置短一些,这样可以处理更高的并发。但是如果供tomcat、数据库等服务的话,就要配置长一些,来达到稳定的效果 334 | ##tcp空闲连接保持1200秒(20分钟),然后经过 3次探测 * 30秒后被丢弃 335 | net.ipv4.tcp_keepalive_time = 1200 336 | net.ipv4.tcp_keepalive_intvl= 30 337 | net.ipv4.tcp_keepalive_probes= 3 338 | 339 | #允许系统打开端口范围,默认是32768 61000,则只能发起2w多连接,改成以下,一个IP可发起差不多6.4w连接。 340 | net.ipv4.ip_local_port_range = 1024 65000 341 | #修改防火墙的表大小默认65536 342 | net.netfilter.nf_conntrack_max = 655350 343 | net.netfilter.nf_conntrack_tcp_timeout_established = 1200 344 | 345 | #避免放大攻击 346 | net.ipv4.icmp_echo_ignore_broadcasts = 1 347 | #开启恶意的icmp错误消息保护 348 | net.ipv4.icmp_ignore_bogus_error_responses = 1 349 | 350 | #开启路由转发 351 | net.ipv4.ip_forward = 1 352 | #关闭反向路径过滤 353 | net.ipv4.conf.all.rp_filter = 0 354 | net.ipv4.conf.default.rp_filter = 0 355 | 356 | #处理无源路由的包 357 | net.ipv4.conf.all.accept_source_route = 0 358 | net.ipv4.conf.default.accept_source_route = 0 359 | 360 | #关闭ipv6 361 | net.ipv6.conf.all.disable_ipv6 = 1 362 | net.ipv6.conf.default.disable_ipv6 = 1 363 | 364 | EOF 365 | 366 | # 使其永久生效 367 | sysctl -p /etc/sysctl.d/99-sysctl.conf 368 | 369 | # (3) 禁用ipv6 370 | log_info "[-] 禁用ipv6... " 371 | sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="ipv6.disable=1 /g' /etc/default/grub 372 | # 重新生成grub.cfg文件 373 | grub2-mkconfig -o /boot/grub2/grub.cfg 374 | sed -i 's/::/#::/g' /etc/hosts 375 | 376 | } 377 | 378 | 379 | ## 名称: Os_TimedataZone 380 | ## 用途: 操作系统系统时间时区配置相关脚本 381 | ## 参数: 无 382 | Os_TimedataZone() { 383 | 384 | log_info "[*] 系统时间时区配置相关脚本,开始执行..." 385 | 386 | # (1) 时区设置东8区,date -R查看系统时间 387 | log_info "[*] 时区设置前的时间: $(date -R) " 388 | timedatectl set-timezone Asia/Shanghai 389 | echo 'Asia/Shanghai' >/etc/timezone 390 | timedatectl set-local-rtc 1 391 | 392 | } 393 | 394 | ## 名称: Os_HostTimeSync_Chrony 395 | ## 用途: 主机间的时间同步,时间不一致会导致很多重要应用的故障。chrony既可作时间服务器服务端,也可作客户端。 396 | ## 参数: 无 397 | Os_HostTimeSync_Chrony() { 398 | 399 | log_info "[*] 主机的时间同步,使用chrony,开始执行....." 400 | 401 | time_server_ip_1=192.168.0.254 402 | time_server_ip_2=192.168.10.254 403 | read -r -p " The time server IP is 192.168.0.254? If not, please enter? [Y/n] " input_yn 404 | case $input_yn in 405 | [yY][eE][sS]|[yY]) 406 | echo -e "\033[32mYes, continue...\033[0m" 407 | ;; 408 | [nN][oO]|[nN]) 409 | while true; do 410 | read -p "请输入时间服务器-1的Ip:" time_server_ip_1 411 | isValidIp ${time_server_ip_1} 412 | [ $? -eq 0 ] && break 413 | done 414 | 415 | while true; do 416 | read -p "请输入时间服务器-2的Ip:" time_server_ip_2 417 | isValidIp ${time_server_ip_2} 418 | [ $? -eq 0 ] && break 419 | done 420 | ;; 421 | *) 422 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 423 | exit 1 424 | ;; 425 | esac 426 | 427 | 428 | # (1) 时间同步软件安装 429 | systemctl status chronyd || yum -y install chrony 430 | grep -q "${time_server_ip_1}" /etc/chrony.conf || sudo tee -a /etc/chrony.conf <<'EOF' 431 | pool ${time_server_ip_1} iburst maxsources 1 432 | pool ${time_server_ip_2} iburst maxsources 1 433 | pool ntp.aliyun.com iburst maxsources 4 434 | keyfile /etc/chrony.keys 435 | driftfile /var/lib/chrony/chrony.drift 436 | logdir /var/log/chrony 437 | maxupdateskew 100.0 438 | rtcsync 439 | makestep 1.0 3 440 | #stratumweight 0.05 441 | #noclientlog 442 | #logchange 0.5 443 | EOF 444 | 445 | systemctl enable chronyd && systemctl restart chronyd && systemctl status chronyd -l 446 | 447 | # 将当前的 UTC 时间写入硬件时钟 (硬件时间默认为UTC),运行命令timedatectl set-local-rtc 0,关闭硬件时钟校时 448 | sudo timedatectl set-local-rtc 0 449 | 450 | # 启用NTP时间同步: 451 | timedatectl set-ntp yes 452 | # 时间服务器连接查看 453 | chronyc tracking 454 | 455 | # 手动校准-强制更新时间 456 | # chronyc -a makestep 457 | 458 | # 硬件时钟(系统时钟同步硬件时钟 ) 459 | hwclock --systohc 460 | # 备用方案: 采用 ntpdate 进行时间同步 ntpdate 192.168.10.254 461 | 462 | # (2) 重启依赖于系统时间的服务 463 | sudo systemctl restart rsyslog.service crond.service 464 | 465 | log_info "[*] Tie confmigure modifiy successful! restarting chronyd rsyslog.service crond.service........." 466 | timedatectl 467 | 468 | } 469 | 470 | 471 | ## 名称: Os_Security_UserPwd 472 | ## 用途: 操作系统安全加固配置脚本(符合等保要求-三级要求)-1-用户密码策略 473 | ## 参数: 无 474 | Os_Security_UserPwd () { 475 | 476 | log_info "[-] 操作系统安全加固配置(符合等保要求-三级要求)-1..." 477 | 478 | # (0) 系统用户及其终端核查配置 479 | log_info "[-] 锁定或者删除多余的系统账户以及创建低权限用户" 480 | # cat /etc/passwd | cut -d ":" -f 1 | tr '\n' ' ' 481 | defaultuser=(root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix chrony ntp rpc rpcuser nfsnobody) 482 | for i in $(cat /etc/passwd | cut -d ":" -f 1,7);do 483 | flag=0; name=${i%%:*}; terminal=${i##*:} 484 | if [[ "${terminal}" == "/bin/bash" || "${terminal}" == "/bin/sh" ]];then 485 | log_warning "用户${i} ,shell终端为 /bin/bash 或者 /bin/sh" 486 | fi 487 | for j in ${defaultuser[@]};do 488 | if [[ "${name}" == "${j}" ]];then 489 | flag=1 490 | break; 491 | fi 492 | done 493 | if [[ $flag -eq 0 ]];then 494 | log_warning "${i} 非默认用户" 495 | fi 496 | done 497 | 498 | #用户的密码文件:/etc/shadow 499 | cp -a /etc/shadow /${BACKUPDIR}/shadow-${EXEC_TIME}.bak 500 | # -l锁定用户的密码使其不能被更改,-u 解锁 501 | passwd -l adm&>/dev/null 2&>/dev/null; passwd -l daemon&>/dev/null 2&>/dev/null; passwd -l bin&>/dev/null 2&>/dev/null; passwd -l sys&>/dev/null 2&>/dev/null; passwd -l lp&>/dev/null 2&>/dev/null; passwd -l uucp&>/dev/null 2&>/dev/null; passwd -l nuucp&>/dev/null 2&>/dev/null; passwd -l smmsplp&>/dev/null 2&>/dev/null; passwd -l mail&>/dev/null 2&>/dev/null; passwd -l operator&>/dev/null 2&>/dev/null; passwd -l games&>/dev/null 2&>/dev/null; passwd -l gopher&>/dev/null 2&>/dev/null; passwd -l ftp&>/dev/null 2&>/dev/null; passwd -l nobody&>/dev/null 2&>/dev/null; passwd -l nobody4&>/dev/null 2&>/dev/null; passwd -l noaccess&>/dev/null 2&>/dev/null; passwd -l listen&>/dev/null 2&>/dev/null; passwd -l webservd&>/dev/null 2&>/dev/null; passwd -l rpm&>/dev/null 2&>/dev/null; passwd -l dbus&>/dev/null 2&>/dev/null; passwd -l avahi&>/dev/null 2&>/dev/null; passwd -l mailnull&>/dev/null 2&>/dev/null; passwd -l nscd&>/dev/null 2&>/dev/null; passwd -l vcsa&>/dev/null 2&>/dev/null; passwd -l rpc&>/dev/null 2&>/dev/null; passwd -l rpcuser&>/dev/null 2&>/dev/null; passwd -l nfs&>/dev/null 2&>/dev/null; passwd -l sshd&>/dev/null 2&>/dev/null; passwd -l pcap&>/dev/null 2&>/dev/null; passwd -l ntp&>/dev/null 2&>/dev/null; passwd -l haldaemon&>/dev/null 2&>/dev/null; passwd -l distcache&>/dev/null 2&>/dev/null; passwd -l webalizer&>/dev/null 2&>/dev/null; passwd -l squid&>/dev/null 2&>/dev/null; passwd -l xfs&>/dev/null 2&>/dev/null; passwd -l gdm&>/dev/null 2&>/dev/null; passwd -l sabayon&>/dev/null 2&>/dev/null; passwd -l named&>/dev/null 2&>/dev/null 502 | 503 | 504 | # (2) 口令策略设置 505 | log_info "[-] 用户口令复杂性策略设置 (密码过期周期0~90、到期前15天提示、密码长度至少15、复杂度设置至少有一个大小写、数字、特殊字符、密码三次不能一样、尝试次数为三次)" 506 | # 相关修改文件备份 507 | cp /etc/login.defs ${BACKUPDIR}/login.defs.bak; 508 | cp /etc/pam.d/password-auth ${BACKUPDIR}/password-auth.bak 509 | cp /etc/pam.d/system-auth ${BACKUPDIR}/system-auth.bak 510 | egrep -q "^\s*PASS_MIN_DAYS\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_MIN_DAYS\s+\S*(\s*#.*)?\s*$/\PASS_MIN_DAYS 0/" /etc/login.defs || echo "PASS_MIN_DAYS 0" >> /etc/login.defs 511 | egrep -q "^\s*PASS_MAX_DAYS\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_MAX_DAYS\s+\S*(\s*#.*)?\s*$/\PASS_MAX_DAYS 90/" /etc/login.defs || echo "PASS_MAX_DAYS 90" >> /etc/login.defs 512 | egrep -q "^\s*PASS_WARN_AGE\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_WARN_AGE\s+\S*(\s*#.*)?\s*$/\PASS_WARN_AGE 15/" /etc/login.defs || echo "PASS_WARN_AGE 15" >> /etc/login.defs 513 | egrep -q "^\s*PASS_MIN_LEN\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_MIN_LEN\s+\S*(\s*#.*)?\s*$/\PASS_MIN_LEN 15/" /etc/login.defs || echo "PASS_MIN_LEN 15" >> /etc/login.defs 514 | 515 | egrep -q "^password\s.+pam_pwquality.so\s+\w+.*$" /etc/pam.d/password-auth && sed -ri '/^password\s.+pam_pwquality.so/{s/pam_pwquality.so\s+\w+.*$/pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=15 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 difok=1 enforce_for_root/g;}' /etc/pam.d/password-auth 516 | egrep -q "^password\s.+pam_unix.so\s+\w+.*$" /etc/pam.d/password-auth && sed -ri '/^password\s.+pam_unix.so/{s/pam_unix.so\s+\w+.*$/pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=3/g;}' /etc/pam.d/password-auth 517 | 518 | egrep -q "^password\s.+pam_pwquality.so\s+\w+.*$" /etc/pam.d/system-auth && sed -ri '/^password\s.+pam_pwquality.so/{s/pam_pwquality.so\s+\w+.*$/pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=15 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 difok=1 enforce_for_root/g;}' /etc/pam.d/system-auth 519 | egrep -q "^password\s.+pam_unix.so\s+\w+.*$" /etc/pam.d/system-auth && sed -ri '/^password\s.+pam_unix.so/{s/pam_unix.so\s+\w+.*$/pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=3/g;}' /etc/pam.d/system-auth 520 | 521 | log_info "[-] 存储用户密码的文件,其内容经过sha512加密,所以非常注意其权限" 522 | # 解决首次登录配置密码时提示"passwd: Authentication token manipulation error" 523 | touch /etc/security/opasswd && chown root:root /etc/security/opasswd && chmod 600 /etc/security/opasswd 524 | 525 | # 此参数需要根据业务来定,否则在使用时候会出现某些权限不足导致程序安装报错 526 | log_info "[-] 配置用户 umask 为022 " 527 | cp -a /etc/profile ${BACKUPDIR}/profile 528 | egrep -q "^\s*umask\s+\w+.*$" /etc/profile && sed -ri "s/^\s*umask\s+\w+.*$/umask 022/" /etc/profile || echo "umask 022" >> /etc/profile 529 | source /etc/profile 530 | #log_info "[-] 设置用户目录创建默认权限, (初始为077比较严格)在未设置umask为027则默认为077" 531 | #egrep -q "^\s*umask\s+\w+.*$" /etc/csh.login && sed -ri "s/^\s*umask\s+\w+.*$/umask 022/" /etc/csh.login || echo "umask 022" >> /etc/csh.login 532 | #egrep -q "^\s*umask\s+\w+.*$" /etc/csh.cshrc && sed -ri "s/^\s*umask\s+\w+.*$/umask 022/" /etc/csh.cshrc || echo "umask 022" >> /etc/csh.cshrc 533 | 534 | 535 | } 536 | 537 | ## 名称: Os_Security_Grub 538 | ## 用途: 操作系统安全加固配置脚本(符合等保要求-三级要求)-2-grub 539 | ## 参数: 无 540 | Os_Security_Grub () { 541 | 542 | # grub是一个用于加载和管理系统启动的完整程序,是一种引导程序;它是计算机启动时运行的第一个软件,会加载操作系统的内核,再由内核初始化操作系统的其他部分。 543 | 544 | # (8) GRUB 安全设置 545 | log_info "[-] 系统 GRUB 安全设置(防止物理接触从grub菜单中修改密码) " 546 | # Grub 关键文件备份 547 | cp -a /etc/grub.d/00_header ${BACKUPDIR}/'00_header'${EXEC_TIME}.bak 548 | cp -a /etc/grub.d/10_linux ${BACKUPDIR}/'10_linux'${EXEC_TIME}.bak 549 | # 设置Grub菜单界面显示时间 550 | sed -i -e 's|set timeout_style=${style}|#set timeout_style=${style}|g' -e 's|set timeout=${timeout}|set timeout=3|g' /etc/grub.d/00_header 551 | # sed -i -e 's|GRUB_TIMEOUT_STYLE=hidden|#GRUB_TIMEOUT_STYLE=hidden|g' -e 's|GRUB_TIMEOUT=0|GRUB_TIMEOUT=3|g' /etc/default/grub 552 | 553 | # grub 用户认证密码创建 554 | #sudo grub2-mkpasswd-pbkdf2 555 | # 输入口令: 556 | # Reeter password:n 557 | # PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.D3A42D2E24A2B2A62CFAB435890840E868088982B3B5EA14FB5F62BC5F0DF6E267CF1D42950A710A2539B4EA0E1D08569928427243E61E063DF2CEF34A571E6B.E7360FF876927678BD33348531B493039D9606062F7A4D9D722BDE94FF26A4B7D2B62AFDDA3F7D47EFDF46623DEAC547733B24E98630FE3961BEDA9257BAEA95 558 | 559 | # 设置认证用户和密钥(使用grub2-mkpasswd-pbkdf2生成密钥,口令为Liyanjing) 560 | tee -a /etc/grub.d/00_header <<'END' 561 | cat <<'EOF' 562 | # GRUB Authentication 563 | set superusers="grub" 564 | password_pbkdf2 grub grub.pbkdf2.sha512.10000.D3A42D2E24A2B2A62CFAB435890840E868088982B3B5EA14FB5F62BC5F0DF6E267CF1D42950A710A2539B4EA0E1D08569928427243E61E063DF2CEF34A571E6B.E7360FF876927678BD33348531B493039D9606062F7A4D9D722BDE94FF26A4B7D2B62AFDDA3F7D47EFDF46623DEAC547733B24E98630FE3961BEDA9257BAEA95 565 | EOF 566 | END 567 | # 设置进入正式系统不需要认证如进入单用户模式进行重置账号密码时需要进行认证。 (高敏感数据库系统不建议下述操作) 568 | # 在 135 加入 -unrestricted ,例如, 此处与Ubuntu不同的是不加--user=grub 569 | # 133 echo "menuentry $(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type- $boot_device_id' {" | sed "s/^/$submenu_indentation/" 570 | # 134 else 571 | # 135 echo "menuentry --unrestricted '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_devic e_id' {" | sed "s/^/$submenu_indentation/" 572 | sed -i '/echo "$title" | grub_quote/ { s/menuentry /menuentry /;}' /etc/grub.d/10_linux 573 | sed -i '/echo "$os" | grub_quote/ { s/menuentry /menuentry --unrestricted /;}' /etc/grub.d/10_linux 574 | # CentOS 方式更新GRUB从而生成boot启动文件 575 | grub2-mkconfig -o /boot/grub2/grub.cfg 576 | 577 | } 578 | 579 | ## 名称: Os_Security_Ssh 580 | ## 用途: 操作系统安全加固配置脚本(符合等保要求-三级要求)-3-ssh安全加固设置 581 | ## 参数: 无 582 | Os_Security_Ssh () { 583 | 584 | # (4) SSHD 服务安全加固设置以及网络登陆Banner设置 585 | log_info "[-] sshd 服务安全加固设置" 586 | cp /etc/ssh/sshd_config ${BACKUPDIR}/sshd_config.bak 587 | # 严格模式 588 | sudo egrep -q "^\s*StrictModes\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*StrictModes\s+.+$/StrictModes yes/" /etc/ssh/sshd_config || echo "StrictModes yes" >> /etc/ssh/sshd_config 589 | 590 | # 禁用X11转发以及端口转发 591 | sudo egrep -q "^\s*X11Forwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*X11Forwarding\s+.+$/X11Forwarding no/" /etc/ssh/sshd_config || echo "X11Forwarding no" >> /etc/ssh/sshd_config 592 | sudo egrep -q "^\s*X11UseLocalhost\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*X11UseLocalhost\s+.+$/X11UseLocalhost yes/" /etc/ssh/sshd_config || echo "X11UseLocalhost yes" >> /etc/ssh/sshd_config 593 | sudo egrep -q "^\s*AllowTcpForwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*AllowTcpForwarding\s+.+$/AllowTcpForwarding no/" /etc/ssh/sshd_config || echo "AllowTcpForwarding no" >> /etc/ssh/sshd_config 594 | sudo egrep -q "^\s*AllowAgentForwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*AllowAgentForwarding\s+.+$/AllowAgentForwarding no/" /etc/ssh/sshd_config || echo "AllowAgentForwarding no" >> /etc/ssh/sshd_config 595 | # 关闭禁用用户的 .rhosts 文件 ~/.ssh/.rhosts 来做为认证: 缺省IgnoreRhosts yes 596 | egrep -q "^(#)?\s*IgnoreRhosts\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*IgnoreRhosts\s+.+$/IgnoreRhosts yes/" /etc/ssh/sshd_config || echo "IgnoreRhosts yes" >> /etc/ssh/sshd_config 597 | 598 | # 登陆前后欢迎提示设置 599 | egrep -q "^\s*(banner|Banner)\s+\W+.*$" /etc/ssh/sshd_config && sed -ri "s/^\s*(banner|Banner)\s+\W+.*$/Banner \/etc\/issue/" /etc/ssh/sshd_config || \ 600 | echo "Banner /etc/issue" >> /etc/ssh/sshd_config 601 | log_info "[-] 远程SSH登录前后提示警告Banner设置" 602 | # SSH登录前后提示警告Banner设置 603 | sudo tee /etc/issue <<'EOF' 604 | ******************* [ 安全登陆 (Security Login) ] ******************* 605 | 您的所有活动都将被安全中心监控和报告. 606 | All activities will be monitored and reported by the security center. 607 | EOF 608 | # SSH登录后提示Banner 609 | # 艺术字B格: http://www.network-science.de/ascii/ 610 | sudo tee /etc/motd <<'EOF' 611 | ################## [ 安全运维 (Security Operation) ] ################## 612 | _ _ _ _ 613 | | | (_)_ _ __ _ _ _ _ | (_)_ _ __ _ 614 | | |__| | || / _` | ' \ || | | ' \/ _` | 615 | |____|_|\_, \__,_|_||_\__/|_|_||_\__, | 616 | |__/ |___/ 617 | 618 | ※ 不用22/3306/6379/等高危默认端口, 不对 Internet 开放; 密码设置足够强壮. 619 | ※ WEB应用上线前须做安全渗透测试; 系统/软件/等定期打补丁. 620 | ※ 跳板机尽量将SSH限制IP在最小化范围内. 621 | 622 | 登录成功, 请仔细执行命令和操作数据. 623 | Login success. Please execute the command and operation data carefully. 624 | EOF 625 | 626 | # (5) 用户远程登录失败次数与终端超时设置 627 | log_info "[-] 用户远程连续登录失败10次锁定帐号5分钟包括root账号" 628 | cp /etc/pam.d/sshd ${BACKUPDIR}/sshd.bak 629 | cp /etc/pam.d/login ${BACKUPDIR}/login.bak 630 | 631 | # 远程登陆 632 | sed -ri "/^\s*auth\s+required\s+pam_tally2.so\s+.+(\s*#.*)?\s*$/d" /etc/pam.d/sshd 633 | sed -ri '2a auth required pam_tally2.so deny=10 unlock_time=300 even_deny_root root_unlock_time=300' /etc/pam.d/sshd 634 | # 宿主机控制台登陆(可选) 635 | # sed -ri "/^\s*auth\s+required\s+pam_tally2.so\s+.+(\s*#.*)?\s*$/d" /etc/pam.d/login 636 | # sed -ri '2a auth required pam_tally2.so deny=10 unlock_time=300 even_deny_root root_unlock_time=300' /etc/pam.d/login 637 | 638 | 639 | # (6) 切换用户命令改为大写的SU,设置用户的日志记录 640 | log_info "[-] 切换用户命令改为大写的SU,设置用户的日志记录" 641 | cp -a /etc/rsyslog.conf ${BACKUPDIR}/rsyslog.conf-${EXEC_TIME}.bak 642 | egrep -q "^\s*authpriv\.\*\s+.+$" /etc/rsyslog.conf && sed -ri "s/^\s*authpriv\.\*\s+.+$/authpriv.* \/var\/log\/secure/" /etc/rsyslog.conf || echo "authpriv.* /var/log/secure" >> /etc/rsyslog.conf 643 | egrep -q "^(\s*)SULOG_FILE\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)SULOG_FILE\s+\S*(\s*#.*)?\s*$/\SULOG_FILE \/var\/log\/.history\/sulog/" /etc/login.defs || echo "SULOG_FILE /var/log/.history/sulog" >> /etc/login.defs 644 | egrep -q "^\s*SU_NAME\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)SU_NAME\s+\S*(\s*#.*)?\s*$/\SU_NAME SU/" /etc/login.defs || echo "SU_NAME SU" >> /etc/login.defs 645 | mkdir -vp /usr/local/bin 646 | cp /usr/bin/su ${BACKUPDIR}/su.bak 647 | mv /usr/bin/su /usr/bin/SU 648 | chmod 777 ${HISDIR} 649 | chattr -R +a ${HISDIR} 650 | 651 | # (7) 用户终端执行的历史命令记录 652 | log_info "[-] 保存用户终端执行的历史命令记录 " 653 | egrep -q "^HISTSIZE\W\w+.*$" /etc/profile && sed -ri "s/^HISTSIZE\W\w+.*$/HISTSIZE=101/" /etc/profile || echo "HISTSIZE=101" >> /etc/profile 654 | source /etc/profile 655 | sudo tee /etc/profile.d/history-record.sh <<'EOF' 656 | # 历史命令执行记录文件路径 657 | LOGTIME=$(date +%Y%m%d-%H-%M-%S) 658 | export HISTFILE="/var/log/.history/${USER}.${LOGTIME}.history" 659 | if [ ! -f ${HISTFILE} ];then 660 | touch ${HISTFILE} 661 | fi 662 | chmod 600 /var/log/.history/${USER}.${LOGTIME}.history 663 | # 历史命令执行文件大小记录设置 664 | HISTFILESIZE=128 665 | HISTTIMEFORMAT="%F_%T $(whoami)#$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'):" 666 | EOF 667 | sudo chmod +775 /etc/profile.d/history-record.sh 668 | sudo chmod a+x /etc/profile.d/history-record.sh 669 | source /etc/profile.d/history-record.sh 670 | 671 | log_info "[-] 关闭执行命令时提示:You have new mail in /var/spool/mail/root " 672 | egrep -q "unset MAILCHECK" /etc/profile && sed -ri "s/unset MAILCHECK/unset MAILCHECK/" /etc/profile || echo -e "unset MAILCHECK" >> /etc/profile 673 | source /etc/profile 674 | ls -lth /var/spool/mail/ 675 | cat /dev/null > /var/spool/mail/root 676 | 677 | log_info "[-] 设置登录超时时间为10分钟 " 678 | # source /etc/profile 报错 -bash: TMOUT: readonly variable,需要打开/etc/profile将#export TMOUT #readonly TMOUT 注释掉。 环境变量readonly TMOUT防止用户更改 679 | egrep -q "^\s*(export|)\s*TMOUT\S\w+.*$" /etc/profile && sed -ri "s/^\s*(export|)\s*TMOUT.\S\w+.*$/export TMOUT=600\nreadonly TMOUT/" /etc/profile || echo -e "export TMOUT=600\nreadonly TMOUT" >> /etc/profile 680 | source /etc/profile 681 | egrep -q "^\s*.*ClientAliveInterval\s\w+.*$" /etc/ssh/sshd_config && sed -ri "s/^\s*.*ClientAliveInterval\s\w+.*$/ClientAliveInterval 600/" /etc/ssh/sshd_config || echo "ClientAliveInterval 600" >> /etc/ssh/sshd_config 682 | } 683 | 684 | ## 名称: Os_Security_FilePermissions 685 | ## 用途: 操作系统安全加固配置脚本(符合等保要求-三级要求)-4-设置或恢复文件or目录权限 686 | ## 参数: 无 687 | Os_Security_FilePermissions () { 688 | 689 | # (3) 设置或恢复重要目录和文件的权限 690 | log_info "[-] 操作系统安全加固配置(符合等保要求-三级要求)-4..." 691 | log_info "[-] 设置或恢复重要目录和文件的权限(设置日志文件非全局可写)" 692 | chmod 755 /etc; 693 | chmod 755 /etc/passwd; 694 | chmod 755 /etc/shadow; 695 | chmod 755 /etc/security; 696 | chmod 644 /etc/group; 697 | chmod 644 /etc/services; 698 | chmod 750 /etc/rc*.d; 699 | chmod 755 /var/log/messages; 700 | chmod 775 /var/log/spooler; 701 | chmod 775 /var/log/cron; 702 | chmod 775 /var/log/secure; 703 | chmod 775 /var/log/maillog; 704 | chmod 775 /var/log/mail&>/dev/null 2&>/dev/null; 705 | chmod 775 /var/log/localmessages&>/dev/null 2&>/dev/null 706 | chmod 600 ~/.ssh/authorized_keys 2&>/dev/null 707 | # 提高系统安全,更改其执行权限,解决Polkit 权限提升漏洞 708 | chmod 0755 /usr/bin/pkexec 709 | 710 | log_info "[-] 删除潜在威胁文件 " 711 | find / -maxdepth 3 -name hosts.equiv | xargs rm -rf 712 | find / -maxdepth 3 -name .netrc | xargs rm -rf 713 | find / -maxdepth 3 -name .rhosts | xargs rm -rf 714 | 715 | } 716 | 717 | ## 名称: Os_Security_Others 718 | ## 用途: 操作系统安全加固配置脚本(符合等保要求-三级要求)-5-更多 719 | ## 参数: 无 720 | Os_Security_Others () { 721 | # (9) 记录安全事件日志 722 | log_info "[-] 记录安全事件日志" 723 | touch /var/log/.history/adm&>/dev/null; chmod 755 /var/log/.history/adm 724 | semanage fcontext -a -t security_t '/var/log/.history/adm' 725 | restorecon -v '/var/log/.history/adm'&>/dev/null 726 | egrep -q "^\s*\*\.err;kern.debug;daemon.notice\s+.+$" /etc/rsyslog.conf && sed -ri "s/^\s*\*\.err;kern.debug;daemon.notice\s+.+$/*.err;kern.debug;daemon.notice \/var\/log\/.history\/adm/" /etc/rsyslog.conf || echo "*.err;kern.debug;daemon.notice /var/log/.history/adm" >> /etc/rsyslog.conf 727 | 728 | 729 | # (10) 配置自动屏幕锁定(适用于具备图形界面的设备), 非图形界面不需要执行 730 | log_info "[-] 对于有图形界面的系统配置10分钟屏幕锁定" 731 | # gconftool-2 --direct \ 732 | # --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory \ 733 | # --type bool \ 734 | # --set /apps/gnome-screensaver/idle_activation_enabled true \ 735 | # --set /apps/gnome-screensaver/lock_enabled true \ 736 | # --type int \ 737 | # --set /apps/gnome-screensaver/idle_delay 10 \ 738 | # --type string \ 739 | # --set /apps/gnome-screensaver/mode blank-only 740 | 741 | # (11) 启防火墙服务 742 | log_info "[-] 开启防火墙服务..." 743 | yum -y install firewalld 744 | systemctl start firewalld.service 745 | systemctl enable firewalld.service 746 | sleep 2 747 | # 161端口是用于“Simple Network Management Protocol”,该协议主要用于管理TCP/IP网络中的网络协议,目前,几乎所有的网络设备厂商都实现对SNMP的支持。 748 | firewall-cmd --zone=public --add-port=161/udp --permanent 749 | firewall-cmd --reload 750 | sleep 3 751 | 752 | # (12) 禁用CentOS服务器中 SELINUX 753 | log_info "[-] 禁用SELinux,永久关闭,重启服务器生效. " 754 | # 临时关闭" 755 | setenforce 0 756 | sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux 757 | 758 | log_info "[-] \n系统将在5s后重启。" 759 | shutdown -r -t 5 760 | } 761 | 762 | 763 | ## 名称: Os_Operation 764 | ## 用途: 操作系统安全运维设置相关脚本 765 | ## 参数: 无 766 | Os_Operation () { 767 | 768 | log_info "[-] 操作系统安全运维设置相关脚本..." 769 | 770 | # (0) 禁用ctrl+alt+del组合键对系统重启 (必须要配置,我曾入过坑) 771 | log_info "[-] 禁用控制台ctrl+alt+del组合键重启" 772 | mv /usr/lib/systemd/system/ctrl-alt-del.target ${BACKUPDIR}/ctrl-alt-del.target-${EXEC_TIME}.bak 773 | 774 | # (1) 设置文件删除rm命令的别名 775 | log_info "[-] 设置文件删除rm命令的别名(防止误删数据,不删除而是移动到回收站) " 776 | sudo cat > /etc/profile.d/alias.sh < /dev/null && sed -ri "/^\s*anonymous_enable\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "anonymous_enable=NO" >> /etc/vsftpd/vsftpd.conf 830 | systemctl list-unit-files|grep vsftpd > /dev/null && echo "root" >> /etc/vsftpd/ftpusers 831 | log_info "[-] 限制FTP用户上传的文件所具有的权限" 832 | systemctl list-unit-files|grep vsftpd > /dev/null && sed -ri "/^\s*write_enable\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "write_enable=NO" >> /etc/vsftpd/vsftpd.conf 833 | systemctl list-unit-files|grep vsftpd > /dev/null && sed -ri "/^\s*ls_recurse_enable\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "ls_recurse_enable=NO" >> /etc/vsftpd/vsftpd.conf 834 | systemctl list-unit-files|grep vsftpd > /dev/null && sed -ri "/^\s*anon_umask\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "anon_umask=077" >> /etc/vsftpd/vsftpd.conf 835 | systemctl list-unit-files|grep vsftpd > /dev/null && sed -ri "/^\s*local_umask\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "local_umask=022" >> /etc/vsftpd/vsftpd.conf 836 | log_info "[-] 限制FTP用户登录后能访问的目录" 837 | systemctl list-unit-files|grep vsftpd > /dev/null && sed -ri "/^\s*chroot_local_user\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "chroot_local_user=NO" >> /etc/vsftpd/vsftpd.conf 838 | log_info "[-] FTP Banner 设置" 839 | systemctl list-unit-files|grep vsftpd > /dev/null && sed -ri "/^\s*ftpd_banner\s*\W+.+$/s/^/#/" /etc/vsftpd/vsftpd.conf && echo "ftpd_banner='Authorized only. All activity will be monitored and reported.'" >> /etc/vsftpd/vsftpd.conf 840 | 841 | log_info "[-] 限制不必要的服务 (根据实际环境配置)" 842 | # systemctl disable rsh&>/dev/null 2&>/dev/null;systemctl disable talk&>/dev/null 2&>/dev/null;systemctl disable telnet&>/dev/null 2&>/dev/null;systemctl disable tftp&>/dev/null 2&>/dev/null;systemctl disable rsync&>/dev/null 2&>/dev/null;systemctl disable xinetd&>/dev/null 2&>/dev/null;systemctl disable nfs&>/dev/null 2&>/dev/null;systemctl disable nfslock&>/dev/null 2&>/dev/null 843 | fi 844 | 845 | log_info "[-] 配置SNMP默认团体字" 846 | if [ -f /etc/snmp/snmpd.conf ]; then 847 | cp /etc/snmp/snmpd.conf ${BACKUPDIR}/'snmpd.conf-'${EXEC_TIME}.bak 848 | cat > /etc/snmp/snmpd.conf <> ${NET_FILE} 1025 | grep -q "^NETMASK=.*$" ${NET_FILE} && sed -i "s/^NETMASK=.*$/NETMASK=\"${NETMASK}\"/" ${NET_FILE} || echo "NETMASK=\"${NETMASK}\"" >> ${NET_FILE} 1026 | grep -q "^GATEWAY=.*$" ${NET_FILE} && sed -i "s/^GATEWAY=.*$/GATEWAY=\"${GATEWAY}\"/" ${NET_FILE} || echo "GATEWAY=\"${GATEWAY}\"" >> ${NET_FILE} 1027 | EOF 1028 | chmod +x /opt/network_staticIp_set.sh 1029 | 1030 | # 网络变量,IPADDR静态ip\NETMASK子网掩码\GATEWAY默认网关 1031 | # 0.获取网卡名 1032 | network_name=$(ip a | sed -r -n 's/^[0-9]+: (.*):.*/\1/p' | grep -v lo) 1033 | array_network_name=(`echo $network_name | tr '\n' ' '` ) 1034 | num=${#array_network_name[@]} #获取数组元素的个数 1035 | 1036 | echo -e "\033[035m*********** 网络卡列表 ***********\033[0m" 1037 | for(( i=0;i<${#array_network_name[@]};i++)) do 1038 | echo -e "\033[032m* [ $i ] ${array_network_name[$i]} \033[0m" 1039 | done; 1040 | echo -e "\033[035m********************************\033[0m" 1041 | 1042 | read -r -p "*请选择网卡名前的序号: " input_n 1043 | if [[ ! $input_n =~ [0-$num]+ ]]; then 1044 | echo -e "\033[31merror! the number you input isn't 1 to $num \n\033[0m" 1045 | exit 1 1046 | fi 1047 | DEVNAME=${array_network_name[$input_n]} 1048 | echo "您选择的网卡是:${DEVNAME}" 1049 | 1050 | # 1. 输入静态ip 1051 | while true; do 1052 | read -p "请输入 ${DEVNAME} 的静态Ip:" IPADDR 1053 | isValidIp ${IPADDR} 1054 | [ $? -eq 0 ] && break 1055 | done 1056 | 1057 | # 2. 输入子网掩码 1058 | while true; do 1059 | read -p "输入子网掩码(225.255.255.0):" NETMASK 1060 | if [ -z "$NETMASK" ];then 1061 | NETMASK="225.255.255.0" 1062 | fi 1063 | isValidIp ${NETMASK} 1064 | [ $? -eq 0 ] && break 1065 | done 1066 | #echo "子网掩码 is $NETMASK" 1067 | 1068 | # 3. 输入默认网关 1069 | ip=(${IPADDR//\./ }) # 按.分割,转成数组 1070 | netmask_default="${ip[0]}.${ip[1]}.${ip[2]}.254" 1071 | 1072 | while true; do 1073 | read -p "输入默认网关(${netmask_default}):" GATEWAY 1074 | if [ -z "$GATEWAY" ];then 1075 | GATEWAY=${netmask_default} 1076 | fi 1077 | isValidIp ${GATEWAY} 1078 | [ $? -eq 0 ] && break 1079 | done 1080 | #echo "默认网关 is $GATEWAY" 1081 | 1082 | # 调用脚本,设置网卡信息(静态ip...) 1083 | /opt/network_staticIp_set.sh ${IPADDR} ${NETMASK} ${GATEWAY} ${DEVNAME} 1084 | 1085 | 1086 | # (2) 系统主机名与本地解析设置 1087 | log_info "[-] 系统主机名与本地解析设置..." 1088 | read -p "请数据主机名(`hostname`):" HOST_NAME 1089 | if [ -z "$HOST_NAME" ];then 1090 | HOST_NAME=`hostname` 1091 | fi 1092 | 1093 | sudo hostnamectl set-hostname ${HOST_NAME} 1094 | # sed -i "s/127.0.1.1\s.\w.*$/127.0.1.1 ${NAME}/g" /etc/hosts 1095 | cp -a /etc/hosts ${BACKUPDIR}/hosts.bak 1096 | grep -q "^\$(hostname -I)\s.\w.*$" /etc/hosts && sed -i "s/\$(hostname -I)\s.\w.*$/${IPADDR} ${HOST_NAME}" /etc/hosts || echo "${IPADDR} ${HOST_NAME}" >> /etc/hosts 1097 | 1098 | # (3) 系统DNS域名解析服务设置 1099 | log_info "[-] DNS域名解析服务设置..." 1100 | # DNS服务器地址 1101 | DNSIP=("8.8.8.8" "114.114.114.114" "223.5.5.5") 1102 | cp -a /etc/resolv.conf ${BACKUPDIR}/resolv.conf.bak 1103 | for dns in ${DNSIP[@]};do 1104 | egrep -q "^nameserver .*${dns}$" /etc/resolv.conf && sed -ri "s/^nameserver.*${dns}$/nameserver ${dns}/" /etc/resolv.conf || echo "nameserver ${dns}" >> /etc/resolv.conf 1105 | done 1106 | 1107 | log_info "[*] network configure modifiy successful! restarting Network........." 1108 | service network restart && ip addr 1109 | } 1110 | 1111 | 1112 | ## 名称: add_group 1113 | ## 用途:创建普通用户的所属组 1114 | ## 参数: 无 1115 | function add_group() { 1116 | # create group if not exists 1117 | egrep "^$group_name" /etc/group >& /dev/null 1118 | if [ $? -ne 0 ] 1119 | then 1120 | groupadd --gid 5001 $group_name 1121 | fi 1122 | } 1123 | 1124 | ## 名称: add_group 1125 | ## 用途:创建普通用户的所属组 1126 | ## 参数: $1(用户名) 或 无 1127 | function add_user() { 1128 | 1129 | log_info "[-] 创建一个拥有管理权限的普通用户,执行sodu命令需要输入密码..." 1130 | 1131 | # 判断是否输入了参数 1132 | if [ -n "$1" ];then 1133 | # echo "第一个参数$1" 1134 | user_name=${1} 1135 | fi 1136 | 1137 | # 1.添加用户,并指定用户id,组id, 1138 | useradd --home-dir /home/$user_name --create-home --uid 5001 \ 1139 | --gid 5001 --shell /bin/bash --skel /dev/null $user_name 1140 | 1141 | # 2.设置用户密码 1142 | echo $user_passwd | passwd --stdin $user_name 1143 | 1144 | # 3.给普通用户授权sudo,先删除后添加 1145 | cp /etc/sudoers ${BACKUPDIR}/sudoers.bak 1146 | chmod -v u+w /etc/sudoers 1147 | sed -i '/^'"$user_name"'.*$/d' /etc/sudoers 1148 | 1149 | # 允许用户your_user执行sudo命令,不输入密码 1150 | tmp_str="$user_name ALL=(ALL) NOPASSWD:ALL" 1151 | # 允许用户your_user执行sudo命令,需要输入密码 1152 | #tmp_str="$user_name ALL=(ALL) ALL" 1153 | sed -i "/^root.*$/a ${tmp_str}" /etc/sudoers 1154 | chmod -v u-w /etc/sudoers 1155 | 1156 | # 4.将普通用户加入到root组 1157 | usermod -a -G root $user_name 1158 | 1159 | log_info "[-] 一个拥有管理权限的普通用户 $user_name 已创建完毕,记得更改其密码哦 " 1160 | } 1161 | 1162 | ## 名字:run_add_user 1163 | ## 用途:执行添加用户方法 1164 | ## 参数:无 1165 | function run_add_user() { 1166 | 1167 | # create group if not exists 1168 | add_group 1169 | 1170 | read -p "创建拥有管理权限的普通用户 ${user_name} (直接回车键),若自定义名请输入:" input_user_name 1171 | # 若没有输入,则使用默认值 1172 | if [ -z "$input_user_name" ];then 1173 | input_user_name=${user_name} 1174 | fi 1175 | 1176 | # create user if not exists 1177 | egrep "^$input_user_name" /etc/passwd >& /dev/null 1178 | if [ $? -ne 0 ]; then 1179 | add_user ${input_user_name} 1180 | else 1181 | log_warning "用户 ${input_user_name} 已存在,无需重复创建 " 1182 | fi 1183 | 1184 | } 1185 | 1186 | ## 名字:Force_UserNextLogin_ChangePwd 1187 | ## 用途:强制用户在下次登录时更改密码 1188 | ## 参数: 无 1189 | function Force_UserNextLogin_ChangePwd() { 1190 | 1191 | log_info "[-] 强制用户在下次登录时更改密码... " 1192 | 1193 | Tmp_DefaultUser="root" 1194 | 1195 | read -r -p "Yes 强制 ${DefaultUser} 用户在下次登录时更改密码? Not 输入其他用户名? [Y/n] " -t 30 input_uname_yn 1196 | case $input_uname_yn in 1197 | [yY][eE][sS]|[yY]) 1198 | echo -e "\033[32mYes, continue...\033[0m" 1199 | chage -d 0 -m 0 -M 90 -W 15 root && passwd --expire root 1200 | ;; 1201 | [nN][oO]|[nN]) 1202 | read -p "请输入用户名:" Tmp_DefaultUser 1203 | # 判断用户是否存在 1204 | egrep "^$Tmp_DefaultUser" /etc/passwd >& /dev/null 1205 | if [ $? -ne 0 ]; then 1206 | log_warning "你输入的用户 ${user_name} 不存在!" 1207 | else 1208 | chage -d 0 -m 0 -M 90 -W 15 ${DefaultUser} && passwd --expire ${DefaultUser} 1209 | fi 1210 | ;; 1211 | *) 1212 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1213 | exit 1 1214 | ;; 1215 | esac 1216 | 1217 | } 1218 | 1219 | ## 名字:Permit_RootSshLogin 1220 | ## 用途:禁止或允许root用户ssh远程登陆,等保三级要求禁止root远程登陆 1221 | ## 参数: 无 1222 | function Root_NoLogin() { 1223 | 1224 | read -r -p "禁止root远程登陆,普通用户你已创建好了吗? [Y/n] " -t 30 input_rootlogin_yn 1225 | case $input_rootlogin_yn in 1226 | [yY][eE][sS]|[yY]) 1227 | log_info "[-] yes 已创建普通用户,继续禁止root用户ssh远程登陆... " 1228 | egrep -q "^\s*PermitRootLogin\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^\s*PermitRootLogin\s+.+$/PermitRootLogin no/" /etc/ssh/sshd_config || echo "PermitRootLogin no" >> /etc/ssh/sshd_config 1229 | systemctl restart sshd 1230 | ;; 1231 | [nN][oO]|[nN]) 1232 | log_info "[-] no 没创建普通用户,还不能禁止root远程登陆... " 1233 | ;; 1234 | *) 1235 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1236 | exit 1 1237 | ;; 1238 | esac 1239 | 1240 | } 1241 | 1242 | function Permit_RootSshLogin() { 1243 | 1244 | read -r -p "你想禁止还是允许root用户ssh远程登陆? [Y禁止/n允许] " -t 30 input_rootlogin_yn 1245 | case $input_rootlogin_yn in 1246 | [yY][eE][sS]|[yY]) 1247 | Root_NoLogin 1248 | ;; 1249 | [nN][oO]|[nN]) 1250 | log_info "[-] 允许root用户ssh远程登陆... " 1251 | egrep -q "^\s*PermitRootLogin\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^\s*PermitRootLogin\s+.+$/PermitRootLogin yes/" /etc/ssh/sshd_config || echo "PermitRootLogin yes" >> /etc/ssh/sshd_config 1252 | systemctl restart sshd 1253 | ;; 1254 | *) 1255 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1256 | exit 1 1257 | ;; 1258 | esac 1259 | 1260 | } 1261 | 1262 | ## 名字:Trash_Clear 1263 | ## 用途:清空回收站,清除历史*.gz日志 1264 | ## 参数: 无 1265 | function Trash_Clear() { 1266 | 1267 | log_info "[-] (1)清空回收站... " 1268 | 1269 | # 附-如何防止rm误删数据,1)为rm设置了别名,2)放弃使用rm改用mv\find ,3)不删除,移动到回收站,4)不要这样用rm -fr /opt/* 正确做法是先切换到指定目录下再删除 1270 | # 查看rm别名# alias rm ,默认设置的别名 # alias rm='rm -i' rm默认开启了alias保护,在删除之前会提示是否删除。 1271 | # 删除以前定义rm的别名。 1272 | #unalias rm > /dev/null 2>&1 1273 | #alias rm='rm -i' 1274 | 1275 | # 删除家目录回收站中的文件,即清空垃圾桶 1276 | find ~/.trash/* -delete 2> /dev/null 1277 | # 删除其他用户(家目录)中的回收站中的文件目录 1278 | find /home/ -type d -name .trash -exec find {} -delete \; 1279 | 1280 | log_info "[-] (2)清理log日志... " 1281 | find /var/log -name "*.gz" -delete 1282 | find /var/log -name "*log.*" -delete 1283 | find /var/log -name "vmware-*.*.log" -delete 1284 | find /var/log -name "*.log" -exec truncate -s 0 {} \; 1285 | find /var/log -name "system@*" -delete 1286 | find /var/log -name "user-1000@*" -delete 1287 | find /tmp/* -delete 2> /dev/null 1288 | 1289 | log_warning "[-!] 询问要不要去掉回收站机制(测试类服务器不需要回收站)..." 1290 | 1291 | echo -e -n "\033[31m\n你要去掉回收站机制吗? [Y去掉/n保留]:\033[0m" 1292 | read -t 30 input_trash_yn 1293 | case $input_trash_yn in 1294 | [yY][eE][sS]|[yY]) 1295 | unalias rm > /dev/null 2>&1 1296 | alias rm='rm -i' 1297 | ;; 1298 | [nN][oO]|[nN]) 1299 | unalias rm > /dev/null 2>&1 1300 | alias rm='sh /usr/local/bin/remove.sh' 1301 | ;; 1302 | *) 1303 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1304 | exit 1 1305 | ;; 1306 | esac 1307 | } 1308 | 1309 | 1310 | ## 打印出选择项 1311 | function cmd_info_print() { 1312 | 1313 | echo -e '\033[32m 1314 | ==========================请选择要操作的项:========================== 1315 | # [0] 创建SWAP交换分区(默认2G) 1316 | # [1] 设置网卡静态IP和DNS(按引导输入ip\子网掩码\默认网关) 1317 | # + <11> 全局配置DNS 1318 | # + <12> 判断能不能上网 1319 | # [2] 在线设置国内yum源,在线yum安装常用软件(htop\ncdu比du性能强\...) 1320 | # [3] 系统优化、安全加固等一键设置: 1321 | # + <31> 系统的最大文件打开数限制,系统内核参数优化(含关闭ipv6) 1322 | # + <32> 时区设置为东8区 1323 | # + <33> 禁用ctrl+alt+del重启系统、定义回收站目录等 1324 | # + < > 系统安全加固(等保三级-操作系统检查项)如下: 1325 | # ++ <35> 用户口令策略(密码过期90天、到期前15天提示、密码长度至少15等) 1326 | # ++ <36> GRUB 安全设置 1327 | # ++ <37> ssh安全加固设置 1328 | # ++ <38> 设置或恢复重要目录和文件的权限 1329 | # ++ <39> 开启防火墙、禁用SELINUX等更多设置,然后重启主机 1330 | # [4] 更改ssh端口号(等保要求不使用22端口,缺省时改为40107) 1331 | # [5] 创建一个拥有管理权限的普通用户(uudocker),执行sodu命令时需要输入密码 1332 | # [6] 禁止或允许root用户远程登陆(等保要求禁止root远程登陆,正解:普通用户登陆后su root) 1333 | # [7] 强制用户在下次登录时更改密码 1334 | # [8] 使用Chrony配置主机时间同步(根据环境需要,可选项) 1335 | # [9] 禁用与设置系统中的某些服务(根据环境需要,可选项) 1336 | # [10] 清空回收站内容 and 询问你删除回收站功能吗?(执行rm误删时,它可拯救你) 1337 | # 1338 | # 以下脚本,仅供参考: 1339 | # Os_Kernel_Upgrade 推荐"离线升级系统内核" 1340 | # disk_Lvsmanager 磁盘LVS逻辑卷添加与配置\033[32m 1341 | ===================================================================== 1342 | \033[31m注意: 1343 | 1. 切换用户的命令su已改为大写的SU 1344 | 2. 回收站目录 cd ${HOME}/.trash 会不断堆积会导致空间不足哦!日志定时清理脚本记得不要用rm改用find或其他切分工具 1345 | 3. 用户终端执行的历史命令记录保存目录为/var/log/.history/${USER}.${LOGTIME}.history\033[0m' 1346 | 1347 | } 1348 | 1349 | function run_main(){ 1350 | 1351 | log_info "run start..." 1352 | 1353 | # 1. 判断系统内核 1354 | kernel=$(uname -r) && log_info "[-] 此系统的内核为:$kernel" 1355 | result=$(echo $kernel | grep "3.10") 1356 | if [[ "$result" != "" ]]; then 1357 | #echo "包含" 1358 | log_warning "[!] Centos7操作系统默认内核3.10存在一些Bugs,请尽快升级。" 1359 | fi 1360 | 1361 | log_info "[-] 本系统的openssh 版本:" && ssh -V 1362 | result_openssh=$(rpm -qi openssh |grep "openssh-7.4") 1363 | if [[ "$result_openssh" != "" ]]; then 1364 | #echo "包含" 1365 | log_warning "[!] openssh默认版本是7.4存在安全漏洞,请尽快升级到最新版本。" 1366 | fi 1367 | 1368 | # 2. 打印出选择项 1369 | cmd_info_print 1370 | 1371 | # 3. 输入数字,执行对应的选项操作 1372 | # 定义一个循环次数计数器 1373 | declare -i autoprintcmd_count=0 1374 | while [[ "$autoprintcmd_count" -le "10" ]]; do 1375 | cmd_number="" 1376 | read -p "Please enter the number of the operation item or Press q to exit: " -t 90 cmd_number 1377 | 1378 | if [[ $cmd_number = "Q" || $cmd_number = "q" ]]; then break; fi 1379 | 1380 | case ${cmd_number} in 1381 | 0) 1382 | # Liunx 系统创建SWAP交换分区(默认2G) 1383 | Os_Swap 1384 | ;; 1385 | 1) 1386 | # 网卡设置静态IP(根据提示,输入ip\子网掩码\默认网关),设置DNS 1387 | Os_Network 1388 | ;; 1389 | 2) 1390 | # 在线设置国内yum源、安装常用软件 1391 | Os_YumSource_Aliyun 1392 | Os_Yum_Install_Software 1393 | ;; 1394 | 3) 1395 | ## 系统优化、安全加固等,一键设置 1396 | # 系统的最大文件打开数限制;系统内核参数优化(含关闭ipv6) 1397 | Os_Optimizationn 1398 | # 主机时区设置东8区 1399 | Os_TimedataZone 1400 | # 禁用ctrl+alt+del重启系统、定义回收站文件夹目录等安全运维有关的设置 1401 | Os_Operation 1402 | # 防止不生效,单独再执行一下 1403 | source /etc/profile.d/alias.sh 1404 | 1405 | # 安全加固-用户口令策略 1406 | Os_Security_UserPwd 1407 | # 安全加固-GRUB 安全设置 1408 | Os_Security_Grub 1409 | # 安全加固-ssh设置 1410 | Os_Security_Ssh 1411 | # 安全加固-设置或恢复重要目录和文件的权限 1412 | Os_Security_FilePermissions 1413 | 1414 | # 安全加固-开启防火墙、禁用SELINUX等更多设置,会重启服务器 1415 | Os_Security_Others 1416 | 1417 | ;; 1418 | 31) 1419 | # 系统的最大文件打开数限制;系统内核参数优化(含关闭ipv6) 1420 | Os_Optimizationn 1421 | ;; 1422 | 32) 1423 | # 主机时区设置东8区 1424 | Os_TimedataZone 1425 | ;; 1426 | 33) 1427 | # 禁用ctrl+alt+del重启系统、定义回收站文件夹目录等安全运维有关的设置 1428 | Os_Operation 1429 | # 防止不生效,单独再执行一下 1430 | source /etc/profile.d/alias.sh 1431 | ;; 1432 | 34) 1433 | log_warning "[-!] 此选项未配置,请选择其他名目的序号" 1434 | ;; 1435 | 35) 1436 | # 安全加固-用户口令策略 1437 | Os_Security_UserPwd 1438 | ;; 1439 | 36) 1440 | # GRUB 安全设置 1441 | Os_Security_Grub 1442 | ;; 1443 | 37) 1444 | # 安全加固-ssh设置 1445 | Os_Security_Ssh 1446 | ;; 1447 | 38) 1448 | # 设置或恢复重要目录和文件的权限 1449 | Os_Security_FilePermissions 1450 | ;; 1451 | 39) 1452 | # 开启防火墙、禁用SELINUX等更多设置,然后重启主机 1453 | Os_Security_Others 1454 | ;; 1455 | 4) 1456 | # 更改ssh登陆端口(默认改为40107) 1457 | run_change_sshport 1458 | ;; 1459 | 5) 1460 | # 创建拥有sudo权限的运维用户(默认uudocker) 1461 | run_add_user 1462 | ;; 1463 | 6) 1464 | # 禁止或允许root远程登录(若禁止root远程登陆,确保已创建了普通用户) 1465 | Permit_RootSshLogin 1466 | ;; 1467 | 7) 1468 | # 强制用户在下次登录时更改密码 1469 | Force_UserNextLogin_ChangePwd 1470 | ;; 1471 | 8) 1472 | # 配置主机时间同步(使用Chrony,根据实际环境进行,可选项) 1473 | Os_HostTimeSync_Chrony 1474 | ;; 1475 | 9) 1476 | # 禁用与设置操作系统中某些服务(根据实际环境进行,可选项) 1477 | Os_Disable_SomeServices 1478 | ;; 1479 | 10) 1480 | # 清空回收站,清理log日志 1481 | Trash_Clear 1482 | ;; 1483 | 11) 1484 | # 全局配置DNS 1485 | setDNS 1486 | ;; 1487 | 12) 1488 | # 判断能不能上网 1489 | internetCheck 1490 | if [ $? -eq 0 ];then 1491 | echo -e "\033[31m主机无法上网,请检查网络设置!\n\033[0m"; 1492 | # 配置下dns 1493 | setDNS 1494 | else 1495 | echo -e "\033[32m哇塞,可以上网冲浪啦!\n\033[0m"; 1496 | fi 1497 | ;; 1498 | *) 1499 | # 打印出选择项 1500 | cmd_info_print 1501 | ((autoprintcmd_count++)) 1502 | ;; 1503 | esac 1504 | 1505 | done 1506 | 1507 | log_info " It's over, Good night. Bye!" 1508 | 1509 | } 1510 | 1511 | run_main 1512 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # linux-initialization 2 | linux系统初始化设置,包含内核参数、时区、安全加固等 3 | 4 | 参考:https://github.com/WeiyiGeek/SecOpsDev/tree/master/OS-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/Linux 5 | 6 | ### . 用途: 7 | 适用于企业内部 CentOS7、ubuntu server 系列服务器的初始化、系统安全加固等设置 8 | 9 | ubuntu: 10 | - Ubuntu 22.04 (LTS) Jammy 11 | - Ubuntu 20.04 (LTS) Focal 12 | 13 | ### . 问题: 14 | 若设置了用户登陆超时,执行 source /etc/profile时报错 -bash: TMOUT: readonly variable,解决方法是 vi /etc/profile将#export TMOUT #readonly TMOUT 注释掉。 15 | 16 | -------------------------------------------------------------------------------- /Ubuntu/Ubuntu-InitializeSecurity.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # @Author: liyanjing,@E-mail: 284223249@qq.com, @wechat: Sd-LiYanJing 4 | # @CreateTime: 2024-03-05 10:50 , @Last ModifiedTime: 2024-04-06 18:05 5 | # @Github: https://github.com/919927181/linux-initialization.git 6 | # @Version: 3.7.2 7 | # @用途:适用于企业内部Ubuntu-server 20.4、22.04 服务器初始化、安全加固(符合等保测评)等 8 | # @参考:https://github.com/WeiyiGeek/SecOpsDev/tree/master/OperatingSystem 9 | # @问题: 10 | # 1. 若设置了用户登陆超时,执行 source /etc/profile时报错 -bash: TMOUT: readonly variable,解决方法是 vi /etc/profile将#export TMOUT #readonly TMOUT 注释掉。 11 | # 2. 请使用管理员执行本脚本,否则报错xxx Permission denied 12 | # 13 | 14 | ####************* 1、定义全局变量 *************#### 15 | # [ssh端口号] 16 | VAR_SSH_PORT=40107 17 | 18 | # Modify the IP/MASK and Gateway,设置主机ip和网关,该功能暂未测试 19 | VAR_IP=10.55.13.70/24 20 | VAR_GATEWAY=10.55.13.1 21 | 22 | # [DNS服务器地址] 23 | VAR_DNSIP="114.114.114.114 223.5.5.5 8.8.8.8" 24 | 25 | # [时区] 26 | VAR_TIMEZONE='Asia/Shanghai' 27 | # [Chrony时间服务器,用于其他机器同步时间] 28 | time_server_ip_1=192.168.0.254 29 | time_server_ip_2=192.168.10.254 30 | 31 | # [tcp空闲连接或超时时间] 32 | # 入口网关LB机器可以设小点(如120秒或300秒),快速释放来处理更高的并发请求。如果是后端web服务\数据库等机器,适当设置大点,来达到稳定的效果 33 | # 设置多大,需要你根据你的场景用途、链路来设,例如 api(要低于数据库的超时时间)->防火墙(1800)-> 数据库(1200) 34 | VAR_TCP_TIMEOUT=1800 35 | 36 | # [创建一个拥有管理权限的普通用户名] 37 | VAR_USER_NAME="uudocker" 38 | # 用户密码,注意特殊字符问题,单引号中的任何字符都只当作是普通字符 39 | VAR_USER_PASSWD='z1M8B%Ka15Fh7Out' 40 | # 普通用户执行sudo命令时,1需要输入密码,0不需要 41 | VAR_FLAG_SUDO_NEEDPWD=1 42 | 43 | # 将普通用户加入到docker引擎的用户组 44 | VAR_GROUP_NAME="docker" 45 | 46 | # Modify Password policy 47 | # 默认密码最大使用为90天、过期前15天提示, 密码最小长度为12 48 | PASS_MIN_DAYS=1 49 | PASS_MAX_DAYS=90 50 | PASS_WARN_AGE=15 51 | PASS_MIN_LEN=12 52 | # 默认加密方式为SHA512, 重试次数为3, 新密码与旧密码至少有6个字符不同, 至少包含3种密码类型,不限制密码中包含大写字母、小写字母、数字、特殊符号的最大数量,记住三次旧密码。 53 | VAR_PASS_ENCRYPT=SHA512 54 | VAR_PASS_RETRY=3 55 | VAR_PASS_DIFOK=6 56 | VAR_PASS_MINCLASS=3 57 | VAR_PASS_UCREDIT=-1 58 | VAR_PASS_LCREDIT=-1 59 | VAR_PASS_DCREDIT=-1 60 | VAR_PASS_OCREDIT=-1 61 | VAR_PASS_REMEMBER=3 62 | 63 | # Modify user login failed count policy 64 | # 默认在5分钟之内登陆失败次数超过6次将锁定10分钟,终端超时10分钟 65 | VAR_LOGIN_FAIL_COUNT=6 66 | VAR_LOGIN_FAIL_INTERVAL=300 67 | VAR_LOGIN_LOCK_TIME=600 68 | VAR_LOGIN_TIMEOUT=300 69 | 70 | # Modify history record count policy 71 | # 历史操作记录条数 72 | VAR_HISTSIZE=128 73 | 74 | # [备份目录] 75 | BACKUPDIR=/data/backup_system 76 | if [ ! -d ${BACKUPDIR} ];then sudo mkdir -p ${BACKUPDIR}; fi 77 | # [记录目录] 78 | HISDIR="/var/log/.history/" 79 | if [ ! -d ${HISDIR} ]; then 80 | sudo mkdir -p ${HISDIR} 81 | sudo chmod -R 775 /var/log/.history 82 | fi 83 | 84 | EXEC_TIME=$(date +%Y%m%d-%m%S) 85 | VAR_COUNT=1 86 | 87 | ####************* 2、公共方法 *************#### 88 | ## 公共方法-全局Log信息打印函数 89 | ## 参数: $@ 90 | log_info() { 91 | printf "[%s]: \033[34mINFO: $@ \033[0m\n" "$(date +'%Y-%m-%dT%H:%M:%S')" 92 | } 93 | log_success() { 94 | printf "[%s]: \033[32mSUCCESS: $@ \033[0m\n" "$(date +'%Y-%m-%dT%H:%M:%S')" 95 | } 96 | log_warning() { 97 | printf "[%s]: \033[33mWARNING: $@ \033[0m\n" "$(date +'%Y-%m-%dT%H:%M:%S')" 98 | sleep 5 99 | } 100 | log_err() { 101 | printf "[%s]: \033[31mERROR: $@ \033[0m\n" "$(date +'%Y-%m-%dT%H:%M:%S')" 102 | } 103 | 104 | ## 公共方法-验证否为数字 105 | isValidNum() { 106 | 107 | local num=$1 108 | local ret=1 109 | 110 | if [ "$num" -gt 0 ] 2>/dev/null ;then 111 | echo "$num is number." 112 | ret=0 113 | else 114 | echo "$num not a number!" 115 | ret=1 116 | fi 117 | 118 | return $ret 119 | } 120 | 121 | ## 公共方法-校验IP地址合法性 122 | isValidIp(){ 123 | local input_ip=$1 124 | local ret=1 125 | 126 | if [[ $input_ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then 127 | # 按.分割,转成数组方便下面的判断 128 | input_ip=(${input_ip//\./ }) 129 | [[ ${input_ip[0]} -le 255 && ${input_ip[1]} -le 255 && ${input_ip[2]} -le 255 && ${input_ip[3]} -le 255 ]] 130 | ret=$? 131 | ret=0 132 | else 133 | echo "IP format error!" && ret=1 134 | fi 135 | 136 | } 137 | 138 | 139 | ## 公共方法-Check the connect status of internet 140 | #ping指令调用时的常用参数 141 | # -c the number of packages to send 142 | # -i internel between two packages 143 | # -W timeout seconds 144 | ## 网络连通性检测 145 | ## 参数: $1 目标IP或域名 或无 146 | Ping_Status() { 147 | 148 | # 判断是否输入了参数 149 | if [ -n "$1" ];then 150 | # echo "第一个参数$1" 151 | Target_IP=${1} 152 | else 153 | # 用户输入目标ip\域名 154 | read -p "网络连通性检测,请输入目标ip或域名:" Target_IP 155 | fi 156 | 157 | ping -c 3 -i 0.2 -W 3 "${Target_IP}" &> /dev/null 158 | if [ $? -eq 0 ];then 159 | echo -e "\033[32msuccess, connected server:${Target_IP} \n\033[0m" 160 | else 161 | echo -e "\033[31mfail, cannot connect server:${Target_IP} \n\033[0m" 162 | fi 163 | 164 | } 165 | 166 | 167 | ####************* 3、业务方法 *************#### 168 | ## 用途: Liunx 系统创建SWAP交换分区,物理内存8G以上,swap空间设置为8G,否则设为2G 169 | ## 参数: 无 170 | Os_Swap(){ 171 | 172 | log_info "Create system swap partition." 173 | 174 | read -r -t 30 -p "Please input, Create swap partition. (Y/N) : " VERIFY 175 | if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then 176 | # 1. 获取主机的内存大小,物理内存在8G以上,swap空间设置为8G,否则设为2G 177 | MEM=$(free -m | awk '/Mem:/{print $2}') 178 | if [ "$MEM" -gt 8000 ]; then 179 | SWAP_COUNT=8G 180 | else 181 | SWAP_COUNT=2G 182 | fi 183 | 184 | # 2.创建swap分区文件,fallocate 命令比 dd 更快,但并非在所有系统上都可用。 185 | sudo fallocate -l ${SWAP_COUNT} /var/swap 186 | #sudo dd if=/dev/zero of=/var/swap bs=1M count=2048 187 | 188 | # 出于安全原因,交换文件应该只能被 root 用户读写。设置权限: 189 | sudo chmod 600 /var/swap 190 | 191 | # 3.启用swap 192 | sudo mkswap /var/swap && sudo mkswap -f /var/swap && sudo swapon /var/swap 193 | 194 | # 4.设置swap文件永久有效 195 | sudo sed -i "/swap/d" /etc/fstab 196 | sudo echo "/var/swap swap swap defaults 0 0" >> /etc/fstab 197 | 198 | sudo swapon --show && sudo free -h 199 | 200 | log_success "this operation completed!" 201 | sleep 1 202 | else 203 | echo "your input not y or Y" 204 | fi 205 | 206 | } 207 | 208 | 209 | ## 用途: 设置DNS 210 | ## 备注:ubuntu 12.04之后版本系统,DNS文件由resolvconf模块接管。直接修改/etc/resolv.conf文件不生效,重启后会还原 211 | Os_SetDNS(){ 212 | 213 | log_info "[-] DNS域名解析服务器地址设置..." 214 | 215 | sudo cp /etc/systemd/resolved.conf ${BACKUPDIR}/"resolved.conf.bak.${EXEC_TIME}" 216 | sudo cp /run/systemd/resolve/resolv.conf ${BACKUPDIR}/"resolv.conf.bak.${EXEC_TIME}" 217 | 218 | sudo sed -i -e "s/^#DNS=.*/DNS=${VAR_DNSIP}/" /etc/systemd/resolved.conf 219 | #sudo sed -i -e "s/^#FallbackDNS=.*/FallbackDNS=114.114.114.114/" -e "s/^#DNSSEC=.*/DNSSEC=allow-downgrade/" -e "s/^#DNSOverTLS=.*/DNSOverTLS=opportunistic/" /etc/systemd/resolved.conf 220 | 221 | sudo systemctl restart systemd-resolved && sudo systemctl enable systemd-resolved 222 | 223 | sudo mv /etc/resolv.conf /etc/"resolv.conf.bak.${EXEC_TIME}" 224 | sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf 225 | sudo systemctl restart NetworkManager 226 | 227 | log_warning "\nDNS域名解析服务设置完毕,请ping下百度试试吧..."; 228 | 229 | } 230 | 231 | 232 | ## 用途: 设置国内源(这里设为阿里,自行更改其他源) 233 | ## 参数: 无 234 | Os_SetSoftSource_Aliyun() { 235 | 236 | log_info "[*] Ubuntu 设置主机软件仓库镜像源... " 237 | 238 | sudo cp /etc/apt/"sources.list{,.bak.$EXEC_TIME}" 239 | 240 | rel_str=$(lsb_release -c -s) 241 | if [ "${rel_str}" == "jammy" ]; then 242 | sudo tee /etc/apt/sources.list <<'EOF' 243 | # 清华大学 Mirrors - Ubuntu 22.04 jammy 244 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy main restricted 245 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates main restricted 246 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy universe 247 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates universe 248 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy multiverse 249 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-updates multiverse 250 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-backports main restricted universe multiverse 251 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-security main restricted 252 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-security universe 253 | deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy-security multiverse 254 | EOF 255 | elif [ "${rel_str}" == "focal" ]; then 256 | sudo tee /etc/apt/sources.list <<'EOF' 257 | # 阿里云 Mirrors - Ubuntu 20.04 focal 258 | deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse 259 | deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse 260 | deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse 261 | deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse 262 | deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse 263 | deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse 264 | deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse 265 | deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse 266 | deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse 267 | deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse 268 | EOF 269 | else 270 | log_err "未找到匹配项,请修改此脚本" 271 | fi 272 | } 273 | 274 | 275 | ## 用途: 获取主机的ip列表 276 | ## 参数: 无 277 | getIpAddr(){ 278 | # 获取IP命令 279 | ipaddr=$(ip addr | grep 'inet'| grep eth[0-9]| grep -v grep | awk -F '/' '{print $1}' | awk '{print $2}') 280 | 281 | # IP地址分割,区分是否多网卡,#array=(172.20.32.214 192.168.1.10); 282 | array=(`echo $ipaddr | tr '\n' ' '` ) 283 | num=${#array[@]} #获取数组元素的个数 284 | 285 | if [ "$num" -eq 1 ]; then 286 | #echo "*单网卡" 287 | local_ip=${array[*]} 288 | elif [ "$num" -gt 1 ]; then 289 | echo -e "\033[035m************************************\033[0m" 290 | echo -e "\033[036m* 请选择一个IP的序号 \033[0m" 291 | for(( i=0;i<${#array[@]};i++)) do 292 | echo -e "\033[032m* $i : ${array[$i]}; \033[0m" 293 | done; 294 | echo -e "\033[035m************************************\033[0m" 295 | 296 | read -r -p "*请选择一个IP的序号: " input 297 | if [[ ! "$input" =~ [0-$num]+ ]]; then 298 | echo -e "\033[31merror! the number you input isn't 1 to $num \n\033[0m" 299 | exit 1 300 | fi 301 | 302 | local_ip=${array[$input]} 303 | #echo "您选择的IP为:${local_ip}" 304 | 305 | else 306 | echo -e "\033[31m*主机未设置网卡IP,请检查服务器环境! \033[0m" 307 | exit 1 308 | fi 309 | 310 | } 311 | 312 | ## 用途: 检查/etc/hosts文件是否加入了主机ip 313 | ## 参数: 无 314 | Os_Check_Hosts(){ 315 | # 获取IP命令 316 | ipaddr=$(ip addr | grep 'inet'| grep eth[0-9]| grep -v grep | awk -F '/' '{print $1}' | awk '{print $2}') 317 | 318 | array=(`echo $ipaddr | tr '\n' ' '` ) # IP地址分割,区分是否多网卡,#array=(172.20.32.214 192.168.1.10); 319 | num=${#array[@]} #获取数组元素的个数 320 | 321 | if [ "$num" -eq 1 ]; then 322 | #echo "*单网卡" 323 | local_ip=${array[*]} 324 | grep "${local_ip}" /etc/hosts >> /dev/null 325 | if [ $? -ne 0 ]; then 326 | log_warning "[!] /etc/hosts 还未添加网卡ip ${local_ip},为避免出现网络问题,请修改主机名后,将ip 主机名 加入到/etc/hosts" 327 | fi 328 | elif [ "$num" -gt 1 ];then 329 | for(( i=0;i<${#array[@]};i++)) do 330 | grep "${array[$i]}" /etc/hosts >> /dev/null 331 | if [ $? -ne 0 ]; then 332 | log_warning "[!] /etc/hosts 还未添加网卡ip ${array[$i]},为避免出现网络问题,请修改主机名后,将ip 主机名 加入到/etc/hosts" 333 | fi 334 | done; 335 | else 336 | echo -e "\033[31m*主机未设置网卡IP,请检查服务器环境! \033[0m" 337 | exit 1 338 | fi 339 | 340 | } 341 | 342 | 343 | ## 用途: 安装常用的软件\工具 344 | ## 参数: 无 345 | Os_Install_Common_Software() { 346 | 347 | log_info "[-] 安装系统所需的常规软件..." 348 | sudo apt autoremove && sudo apt install -y gcc g++ make 349 | sudo apt autoremove && sudo apt install -y nano vim git unzip wget ntpdate dos2unix net-tools tree htop ncdu nload sysstat psmisc bash-completion fail2ban jq nfs-common rpcbind libpam-cracklib dialog man-db cron ufw iputils-ping 350 | 351 | log_info "[-] 清理安装软件的缓存..." 352 | sudo apt clean all && sudo apt-get autoclean -y && sudo apt-get autoremove -y 353 | find /var/log/apt/ -type f -delete 354 | 355 | # 针对 22.04 是否取消最小化软件安装.(后续安装部署软件太痛苦了) 356 | release=$(lsb_release -c -s) 357 | if [ "${release}" == "jammy" ];then 358 | read -t 30 -p "请输入, 你是否取消最小化软件安装,建议取消,因为后续安装部署软件太痛苦了. (Y/N) : " VERIFY 359 | if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then echo -e "y\n" | unminimize;fi 360 | fi 361 | 362 | log_success "This operation is completed!" 363 | 364 | } 365 | 366 | ## 用途: 升级系统软件、内核 367 | ## 参数: 无 368 | Os_Update_Software(){ 369 | 370 | log_info "开始安全升级系统软件、内核..." 371 | sudo apt autoclean -y && sudo apt update && sudo apt upgrade -y 372 | log_success "this operation completed!" 373 | } 374 | 375 | 376 | # 用途: 禁用烦人的apport错误报告 377 | # 参数: 无 378 | svc_disable_apport(){ 379 | VAR_COUNT=1 380 | log_info "[${VAR_COUNT}]. Disable Apport service" 381 | if [ -f /etc/default/apport ]; then 382 | sudo cp /etc/default/apport ${BACKUPDIR} 383 | sudo sed -i 's/enabled=.*/enabled=0/' /etc/default/apport 384 | sudo systemctl stop apport.service && sudo systemctl disable apport.service 385 | sudo systemctl mask apport.service >/dev/null 2>&1 386 | fi 387 | 388 | log_success "[${VAR_COUNT}]. This operation is completed!" 389 | sleep 1 390 | ((VAR_COUNT++)) 391 | 392 | } 393 | 394 | # 用途: 非云的环境下禁用或者卸载多余的cloud-init软件及其服务 395 | # 参数: 无 396 | svc_remove_cloudinit(){ 397 | log_info "[${VAR_COUNT}]. Disable Cloud-init service" 398 | sudo systemctl stop cloud-init.target cloud-init.service cloud-config.service cloud-init-local.service cloud-final.service 399 | sudo systemctl disable cloud-init.target cloud-init.service cloud-config.service cloud-init-local.service cloud-final.service 400 | sudo systemctl mask cloud-init.service cloud-config.service cloud-init-local.service cloud-final.service >/dev/null 2>&1 401 | 402 | # 禁用 Ubuntu 中的 cloud-init, 在 /etc/cloud 目录下创建 cloud-init.disable 文件(重启后生效) 403 | if [ ! -f /etc/cloud/cloud-init.disable ];then sudo touch /etc/cloud/cloud-init.disable;fi 404 | 405 | read -t 30 -p "Please input, is Remove cloud-init related files and their directories (Y/N) : " VERIFY 406 | if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then 407 | sudo apt purge cloud-init -y 408 | sudo rm -rf /etc/cloud && sudo rm -rf /var/lib/cloud/ 409 | fi 410 | 411 | sudo systemctl daemon-reload 412 | log_success "[${VAR_COUNT}]. This operation is completed!" 413 | sleep 1 414 | ((VAR_COUNT++)) 415 | 416 | } 417 | 418 | 419 | # 用途: 在系统启动时禁用debug-shell服务 420 | # 参数: 无 421 | svc_disable_debugshell(){ 422 | log_info "[${VAR_COUNT}]. Disable debug-shell service" 423 | 424 | sudo systemctl stop debug-shell.service 425 | sudo systemctl mask debug-shell.service >/dev/null 2>&1 426 | 427 | log_success "[${VAR_COUNT}]. This operation is completed!" 428 | sleep 1 429 | ((VAR_COUNT++)) 430 | } 431 | 432 | # 用途: 系统资源文件打开句柄数优化配置 433 | # 参数: 无 434 | Os_Optimize_ResourcesLimits() { 435 | 436 | VAR_COUNT=1 437 | 438 | log_info "[${VAR_COUNT}]. Optimize ulimit for high concurrency situations." 439 | log_info "[-] Linux 系统的最大进程数和最大文件打开数限制." 440 | sudo cp -a /etc/security/limits.conf ${BACKUPDIR}/"etc_security_limits.conf.bak.${EXEC_TIME}" 441 | 442 | sudo egrep -q "^\s*ulimit -HSn\s+\w+.*$" /etc/profile && sed -ri "s/^\s*ulimit -HSn\s+\w+.*$/ulimit -HSn 655350/" /etc/profile || echo "ulimit -HSn 655350" >> /etc/profile 443 | sudo egrep -q "^\s*ulimit -HSu\s+\w+.*$" /etc/profile && sed -ri "s/^\s*ulimit -HSu\s+\w+.*$/ulimit -HSu 655350/" /etc/profile || echo "ulimit -HSu 655350" >> /etc/profile 444 | 445 | # 修改用户级的限制,包含用户(如soft软件nginx)进程打开文件描述符的最大数目和任意用户的最大进程数 446 | # 文件描述符,linux系统里一切都是文件,例如每建立一个TCP连接,就得分配一个文件描述符,linux 对可打开的文件描述符的数量分别作了系统级、用户级和进程级这三个方面的限制。 447 | ## 系统级别的 cat /proc/sys/fs/file-max 448 | ## 用户级别的 cat /etc/security/limits.conf 449 | ## 进程级别的 cat /proc/sys/fs/nr_open 450 | 451 | # linux 2.6内核下开启文件打开数为65535,像阿里云华为云的云主机一般是65535,nginx调度时分配请求到进程并不是那么的均衡,假如超过会返回502错误,因此可将文件打开符设置大一点如102400。 452 | # 一个进程代表了一个服务,本地进程与进程之间,本地进程(clinet)与远程server端口之间,通过tcp套接字进行通信。 453 | # 客户端的最大tcp连接数是65535,因为每当与服务端建立一个新tcp连接就会占用一个端口,而计算机端口最大端口数是65535 454 | ## 先删除掉以前设置的,然后再在# End 上面增加以下内容 455 | ## 第一列表示用户和组(@开头,*号表示任一用户),第二列表示软限制还是硬限制,第三列表示限制的资源类型,第四列表示限制的最大值 456 | ## 资源类型:core是内核文件,nofile最大打开的文件描述符,noproc最大用户进程数,一般情况下只限制文件描述符数和进程数就够了 457 | ## soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值。 458 | 459 | if ! grep -qi "# OS Resources Limits Config" /etc/security/limits.conf; then 460 | sudo sed -i 's/^# End of file*//' /etc/security/limits.conf 461 | { 462 | echo '# OS Resources Limits Config' 463 | echo '* soft nofile 655350' 464 | echo '* hard nofile 655350' 465 | echo '* soft nproc unlimited' 466 | echo '* hard nproc unlimited' 467 | echo '* soft core unlimited' 468 | echo '* hard core unlimited' 469 | echo '# End of file' 470 | } >> /etc/security/limits.conf 471 | fi 472 | 473 | log_success "this operation is completed!" 474 | sleep 1 475 | ((VAR_COUNT++)) 476 | 477 | } 478 | 479 | ## 用途: 系统内核参数的优化配置 480 | ## 参数: 无 481 | Os_Optimize_Kernel(){ 482 | 483 | log_info "[${VAR_COUNT}]. Optimal configuration of system kernel parameters." 484 | log_info "[-] 正在进行操作系统内核参数优化设置..." 485 | 486 | sudo cp /etc/sysctl.d/99-sysctl.conf ${BACKUPDIR}/"99-sysctl.conf.bak.${EXEC_TIME}" 487 | 488 | # 通常设为8192或262144 489 | queue_length=262144 490 | 491 | sudo cat > /etc/sysctl.d/99-sysctl.conf << EOF 492 | # sysctl settings are defined through files in 493 | # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. 494 | # 495 | # Vendors settings live in /usr/lib/sysctl.d/. 496 | # To override a whole file, create a new file with the same in 497 | # /etc/sysctl.d/ and put new settings there. To override 498 | # only specific settings, add a file with a lexically later 499 | # name in /etc/sysctl.d/ and put new settings there. 500 | # 501 | # For more information, see sysctl.conf(5) and sysctl.d(5). 502 | 503 | # inotify的watch数量,默认值8192 504 | fs.inotify.max_user_watches=8192000 505 | # aio最大值,默认值65536 506 | fs.aio-max-nr=1048576 507 | # 系统级的文件描述符的数量限制,该参数描述了整个系统可以打开的最大文件数量(也称为文件句柄数),默认值98529,是指所有进程(整个系统)可以打开的最大文件数,但是root用户不会受该参数限制。 508 | fs.file-max = 1048575 509 | # 进程级别的文件描述符的数量限制,要保证比 hard nofile大。我这里注释掉了,因为报"cannot stat /proc/sys/fs/nr_open : No such file or directory" 510 | #fs.nr_open = 1048575 511 | 512 | # 关sysrq功能 513 | kernel.sysrq = 0 514 | # core文件名添加pid作为扩展名 515 | kernel.core_uses_pid = 1 516 | # 修改消息队列长度 517 | kernel.msgmnb = 65535 518 | kernel.msgmax = 65535 519 | # 设置最大内存共享段大小bytes 520 | kernel.shmmax = 68719476736 521 | kernel.shmall = 4294967296 522 | 523 | # 内存缓存IO优化 524 | # centos7上默认值是30,当内存使用100-10=90%,就开始出现有交换分区的使用 525 | vm.swappiness = 10 526 | vm.vfs_cache_pressure = 50 527 | vm.dirty_background_ratio = 5 528 | vm.dirty_ratio = 10 529 | 530 | ## tcp连接,请阅读TCP连接的原理知识,比如作为端口数65535,作为客户端最大理论能发起65535个连接请求,实际也就3万多 531 | # 内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,4KB,可用命令# getconf PAGESIZE 查看 532 | # 8T内存机器,建议用以下参数: 533 | #net.ipv4.tcp_mem = 94500000 915000000 927000000 534 | # 第一个数字表示,当 tcp 使用的 page 少于 94500000 时,kernel 不对其进行任何的干预,建议=系统内存*50%*50% 535 | # 第二个数字表示,当 tcp 使用了超过 915000000 的 pages 时,kernel 会进入 “memory pressure” 压力模式,建议=系统内存*50%*70% 536 | # 第三个数字表示,当 tcp 使用的 pages 超过 927000000 时(相当于3536GB内存),就会报:Out of socket memory,建议=系统内存的50% 537 | # 256GB内存机器, TCP连接最多约使用128GB内存, 建议用以下参数 538 | #net.ipv4.tcp_mem = 16777216 22369600 33554432 539 | # 8GB内存机器,52万TCP连接使用2GB内存,限制在系统内存的四分之一,524288*4096/1024/1024/104=2GB,2.7GB,4GB,, 建议用以下参数 540 | #net.ipv4.tcp_mem = 524288 699050 1048576 541 | # 16GB内存机器,百万TCP连接使用4GB内存,最多约使用8GB内存,建议用以下参数 542 | net.ipv4.tcp_mem = 1048576 1468006 2097152 543 | 544 | ## 为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte 545 | # 4GB,TCP内存能容纳的连接数,约为4096MB/16KB=256K=26万 546 | # 48GB,TCP内存能容纳的连接数约为300万 547 | net.ipv4.tcp_rmem = 10240 87380 12582912 548 | net.ipv4.tcp_wmem = 10240 87380 12582912 549 | net.core.rmem_max = 12582912 550 | net.core.rmem_default = 6291456 551 | net.core.wmem_max = 12582912 552 | net.core.wmem_default = 6291456 553 | 554 | # 最大孤儿套接字(orphan sockets)数,单位是个,仅仅是为防止简单的DoS攻击,每个孤儿socket占用64KB空间 555 | # 注意:当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时,就会报:Out of socket memory 556 | # 每个孤儿socket可占用多达64KB内存,此时占用内存 3276800/2*64KB/1024=102400MB=100GB 557 | net.ipv4.tcp_max_orphans = 3276800 558 | 559 | # 表示作为client用于向外连接时使用的端口范围,默认是32768 61000,只能发起2w多连接,改后一个IP可发起差不多6.4w连接。 560 | net.ipv4.ip_local_port_range = 1024 65000 561 | # 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。 562 | net.ipv4.tcp_max_tw_buckets = 5000 563 | ## 修改跟踪所有网络连接状态的表大小,默认为65536。ubuntu中,需要加载nf_conntrack模块后,才能正常配置,否则报错No such file or directory 564 | # 16或32G内存的机器推荐设置为1048575,64G的机器推荐设为4194304 565 | net.netfilter.nf_conntrack_max = 1048575 566 | net.nf_conntrack_max = 1048575 567 | # tcp会话的超时时间,默认是432000秒 (5天),这里缩短下30分钟、5分钟,使其尽快释放 568 | net.netfilter.nf_conntrack_tcp_timeout_established = ${VAR_TCP_TIMEOUT} 569 | 570 | 571 | ## 优化内核套接字TCP的半连接队列、全连接队列 572 | # SYN队列的长度,加大半连接队列长度,可以容纳更多等待连接的网络连接数。 573 | # 要想增大半连接队列,不能只单纯增大tcp_max_syn_backlog的值,还需一同增大somaxconn和backlog,否则,只单纯增大tcp_max_syn_backlog是无效的。 574 | net.ipv4.tcp_max_syn_backlog = ${queue_length} 575 | 576 | # 每个网络接口(ip:listen端口)接收数据包速率比进程处理这些包的速率快时,允许送到全连接队列的最大数目 577 | net.core.netdev_max_backlog = ${queue_length} 578 | # 全连接队列大小,默认128,对于负载很大的服务程序来说大大的不够,一般会将它修改为2048或者更大。 579 | # 注意:TCP 全连接队列足最大值取决于 somaxconn 和 backlog 之间的最小值,即 min(somaxconn, backlog), 580 | # 因此,你还要调整应用进程 listen(int sockfd, int backlog) 函数中的backlog大小,Nginx默认值是511,tomcat默认值是100 581 | # 注意:设为262144在内核版本3.10报错setting key "net.core.somaxconn": Invalid argument 值不应超过65535,除非安装新的内核 582 | net.core.somaxconn = ${queue_length} 583 | # 设置时间戳,避免序列号的卷绕,0禁用,1启用,针对Nginx服务器来说,建议关闭。 584 | net.ipv4.tcp_timestamps = 0 585 | net.ipv4.tcp_sack = 1 586 | net.ipv4.tcp_window_scaling = 1 587 | 588 | ## 抵御SYN泛洪攻击,增大半\全连接队列、开启tcp_syncookies功能、减少SYN+ACK重传次数 589 | # 只要启用tcp_syncookies,就不会发生SYN等待队列溢出了,这样做的好处是还可抵御少量SYN泛洪攻击 590 | # 如果已通过三层防火墙进行安全防护,可以直接关闭syncookies,降低CPU消耗。 591 | net.ipv4.tcp_syncookies = 1 592 | # 内核放弃建立全连接之前发送SYN-ACK包的数量 593 | net.ipv4.tcp_synack_retries = 1 594 | # 客户端在等待服务器回复的ACK报文。正常情况下,服务器会在几毫秒内返回ACK,但如果客户端迟迟没有收到ACK会怎么样呢?客户端会重发SYN,重试的次数由tcp_syn_retries参数控制,默认是6次 595 | net.ipv4.tcp_syn_retries = 1 596 | 597 | ## 它允许服务器和客户端在连接建立握手阶段,就捎带着数据,从而使应用节省了一个RTT的时延。 598 | ## tcp_fastopen 参数是按比特位控制的 599 | # 0:比特位0x00,关闭 600 | # 1:比特位0x01,作为客户端使用FastOpen功能,默认值 601 | # 2:比特位0x10,作为服务端使用FastOpen功能 602 | # 3:比特位0x11,无论是客户端还是服务端都使用FastOpen功能 603 | net.ipv4.tcp_fastopen = 3 604 | 605 | # 默认为0表示关闭;值为1允许将TIME-WAIT sockets重新用于新的TCP连接,作为客户端基本可实现单机理论6w/s短连接请求,需要再高就增加IP数量; 606 | net.ipv4.tcp_tw_reuse = 1 607 | # 作为客户端每发起一个tcp连接 就用掉一个端口,TIME_OUT的连接过多则会直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大 608 | # 线上环境,默认为0关闭,打开设为1,在有NAT的环境下打开有问题。案例,一台机器有vip,tcp_timestamps、tcp_tw_recycle设为1后,telnet VIP的端口出现时通时不通 609 | # net.ipv4.tcp_tw_recycle = 0 610 | 611 | # 如果套接字由本端来断开,这个参数决定了它保持在FIN-WAIT-2状态的时间,缺省值为60秒 612 | net.ipv4.tcp_fin_timeout = 10 613 | ## keepalive启用时,TCP发送keepalive消息的频度缺省是2小时 614 | ## nginx做反向代理,为了快速释放链接,超时时间配置短一些(如120秒或300秒),这样可以处理更高的并发。但是如果供tomcat、数据库等服务的话,就要配置长一些,来达到稳定的效果 615 | ## tcp空闲连接保持1800秒(30分钟),然后经过 3次探测 * 30秒后被丢弃; 616 | net.ipv4.tcp_keepalive_time = ${VAR_TCP_TIMEOUT} 617 | net.ipv4.tcp_keepalive_intvl= 30 618 | net.ipv4.tcp_keepalive_probes= 3 619 | 620 | # 避免放大攻击 621 | net.ipv4.icmp_echo_ignore_broadcasts = 1 622 | # 开启恶意的icmp错误消息保护 623 | net.ipv4.icmp_ignore_bogus_error_responses = 1 624 | 625 | ## 开启路由转发 626 | net.ipv4.ip_forward = 1 627 | # 关闭反向路径过滤 628 | net.ipv4.conf.all.rp_filter = 0 629 | net.ipv4.conf.default.rp_filter = 0 630 | 631 | # 关闭路由转发,记得注释掉上面的 632 | #net.ipv4.ip_forward = 0 633 | #net.ipv4.conf.all.send_redirects = 0 634 | #net.ipv4.conf.default.send_redirects = 0 635 | #net.ipv4.conf.all.rp_filter = 1 636 | #net.ipv4.conf.default.rp_filter = 1 637 | 638 | # 处理无源路由的包 639 | net.ipv4.conf.all.accept_source_route = 0 640 | net.ipv4.conf.default.accept_source_route = 0 641 | 642 | # 关闭ipv6 643 | #net.ipv6.conf.all.disable_ipv6 = 1 644 | #net.ipv6.conf.default.disable_ipv6 = 1 645 | 646 | EOF 647 | 648 | # 加载nf_conntrack模块后,才可正常配置nf_conntrack_max,否则报错No such file or directory 649 | sudo modprobe nf_conntrack 650 | # 使其永久生效 651 | sudo sysctl -p /etc/sysctl.d/99-sysctl.conf 652 | 653 | # (2) 禁用ipv6 654 | log_info "[-] 禁用ipv6... " 655 | sed -i 's/ipv6.disable=1 //g' /etc/default/grub 656 | sudo sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="ipv6.disable=1 /g' /etc/default/grub 657 | # 用于解决docker警告WARNING: No swap limit support 658 | sed -i 's/cgroup_enable=memory swapaccount=1 //g' /etc/default/grub 659 | sudo sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 /g' /etc/default/grub 660 | 661 | # 重新生成grub.cfg文件 662 | sudo update-grub 663 | sudo sed -i 's/::/#::/g' /etc/hosts 664 | 665 | log_success "This operation is completed!" 666 | sleep 1 667 | ((VAR_COUNT++)) 668 | } 669 | 670 | ## 用途: 设置系统时间时区 671 | ## 参数: 无 672 | Os_TimedataZone() { 673 | 674 | log_info "[${VAR_COUNT}]. set timezone..." 675 | log_info "[-] 设置时区,当前时间: $(date -R)" 676 | 677 | # 1.时区设置 678 | sudo timedatectl set-timezone ${VAR_TIMEZONE} 679 | # sudo dpkg-reconfigure tzdata # 修改确认 680 | # sudo bash -c "echo 'Asia/Shanghai' > /etc/timezone" # 与timedatectl set-timezone命令一样 681 | 682 | # 2.设置硬件时钟,1设为本地时区的当前时间,0设为UTC时区的时间 (硬件时间默认为UTC) 683 | sudo timedatectl set-local-rtc 1 684 | sudo hwclock -w 685 | 686 | log_success "This operation is completed!" 687 | sleep 1 688 | ((VAR_COUNT++)) 689 | 690 | } 691 | 692 | 693 | ## 名称: Os_HostTimeSync_Chrony 694 | ## 用途: 主机间的时间同步,时间不一致会导致很多重要应用的故障。chrony既可作时间服务器服务端,也可作客户端。 695 | ## 参数: 无 696 | Os_HostTimeSync_Chrony() { 697 | 698 | log_info "[*] 主机的时间同步,使用chrony,开始执行....." 699 | 700 | read -r -p " Is your time server IP is ${time_server_ip_1}? If not, please enter? [Y/n] " input_yn 701 | case $input_yn in 702 | [yY][eE][sS]|[yY]) 703 | echo -e "\033[32mYes, continue...\033[0m" 704 | ;; 705 | [nN][oO]|[nN]) 706 | while true; do 707 | read -p "请输入时间服务器-1的Ip:" time_server_ip_1 708 | isValidIp "${time_server_ip_1}" 709 | [ $? -eq 0 ] && break 710 | done 711 | 712 | while true; do 713 | read -p "请输入时间服务器-2的Ip:" time_server_ip_2 714 | isValidIp "${time_server_ip_2}" 715 | [ $? -eq 0 ] && break 716 | done 717 | ;; 718 | *) 719 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 720 | exit 1 721 | ;; 722 | esac 723 | 724 | 725 | # (1) 时间同步软件安装 726 | sudo systemctl status chronyd || sudo apt install -y chrony 727 | grep -q "${time_server_ip_1}" /etc/chrony.conf || sudo tee -a /etc/chrony.conf <<'EOF' 728 | pool ${time_server_ip_1} iburst maxsources 1 729 | pool ${time_server_ip_2} iburst maxsources 1 730 | pool ntp.aliyun.com iburst maxsources 4 731 | keyfile /etc/chrony.keys 732 | driftfile /var/lib/chrony/chrony.drift 733 | logdir /var/log/chrony 734 | maxupdateskew 100.0 735 | rtcsync 736 | makestep 1.0 3 737 | #stratumweight 0.05 738 | #noclientlog 739 | #logchange 0.5 740 | EOF 741 | 742 | sudo systemctl enable chronyd && sudo systemctl restart chronyd && sudo systemctl status chronyd -l 743 | 744 | # 将当前的 UTC 时间写入硬件时钟 (硬件时间默认为UTC),运行命令timedatectl set-local-rtc 0,关闭硬件时钟校时 745 | sudo timedatectl set-local-rtc 0 746 | 747 | # 启用NTP时间同步: 748 | sudo timedatectl set-ntp yes 749 | # 时间服务器连接查看 750 | chronyc tracking 751 | 752 | # 手动校准-强制更新时间 753 | # chronyc -a makestep 754 | 755 | # 硬件时钟(系统时钟同步硬件时钟 ) 756 | hwclock --systohc 757 | # 备用方案: 采用 ntpdate 进行时间同步 ntpdate 192.168.10.254 758 | 759 | # (2) 重启依赖于系统时间的服务 760 | sudo systemctl restart rsyslog.service crond.service 761 | 762 | log_info "[*] Tie confmigure modifiy successful! restarting chronyd rsyslog.service crond.service........." 763 | timedatectl 764 | 765 | } 766 | 767 | ## 用途: 禁用 ctrl+alt+del 组合键对系统重启 (必须要配置我曾入过坑) 768 | # 参数: 无 769 | sec_disable_ctrl_alt_del() { 770 | log_info "[${VAR_COUNT}] Disable ctrl+alt+del key restart computer." 771 | log_info "[-] 禁用控制台 Ctrl+Alt+Del 组合键重启." 772 | 773 | if [ -f /usr/lib/systemd/system/ctrl-alt-del.target ];then 774 | sudo systemctl stop ctrl-alt-del.target 775 | sudo systemctl mask ctrl-alt-del.target >/dev/null 2>&1 776 | sudo systemctl daemon-reload 777 | sudo sed -i 's/^#CtrlAltDelBurstAction=.*/CtrlAltDelBurstAction=none/' /etc/systemd/system.conf 778 | sudo mv /usr/lib/systemd/system/ctrl-alt-del.target ${BACKUPDIR}/"ctrl-alt-del.target.bak.${EXEC_TIME}" 779 | fi 780 | 781 | log_success "[${VAR_COUNT}] This operation is completed!" 782 | sleep 1 783 | ((VAR_COUNT++)) 784 | } 785 | 786 | 787 | # 用途: 设置文件删除回收站别名(防止误删文件)(必须要配置,我曾入过坑) 788 | # 参数: 无 789 | sec_file_recycle_bin() { 790 | 791 | log_info "[${VAR_COUNT}]. Enable file or dirctory delete recycle bin." 792 | log_info "[-] 1> 设置文件删除rm命令的别名(防止rm -rf误操作,不删除而是移动到回收站) " 793 | sudo tee /etc/profile.d/alias.sh <<'EOF' 794 | # User specific aliases and functions 795 | # 删除回收站 796 | # find ~/.trash -delete 797 | # 删除空目录 798 | # find ~/.trash -type d -delete 799 | alias rm="sh /usr/local/bin/remove.sh" 800 | EOF 801 | 802 | log_info "[-] 2> 设置文件删除回收站别名(防止误删文件)" 803 | # $HOME是linux的系统变量,是当前用户的家目录变量,cd $HOME 进入当前用户的主目录 804 | sudo tee /usr/local/bin/remove.sh <<'EOF' 805 | #!/bin/sh 806 | # 定义回收站文件夹目录.trash 807 | trash="/.trash" 808 | deltime=$(date +%Y%m%d) 809 | TRASH_DIR="${HOME}${trash}/${deltime}" 810 | # 建立回收站目录当不存在的时候 811 | if [ ! -e ${TRASH_DIR} ];then 812 | mkdir -p ${TRASH_DIR} 813 | fi 814 | for i in $*;do 815 | if [ "$i" = "-rf" ];then continue;fi 816 | # 防止误操作 817 | if [ "$i" = "/" ];then echo '# Danger delete command, Not delete / directory!';exit -1;fi 818 | # 定义秒时间戳 819 | STAMP=$(date +%s) 820 | # 得到文件名称(非文件夹),参考man basename 821 | fileName=$(basename $i) 822 | # 将输入的参数,对应文件mv至.trash目录,文件后缀,为当前的时间戳 823 | mv $i ${TRASH_DIR}/${fileName}.${STAMP} 824 | done 825 | EOF 826 | 827 | # 2.执行权限赋予立即生效 828 | sudo chmod a+x /usr/local/bin/remove.sh /etc/profile.d/alias.sh 829 | source /etc/profile.d/alias.sh /etc/profile.d/history-record.sh 830 | 831 | log_success "[${VAR_COUNT}] This operation is completed!" 832 | sleep 1 833 | ((VAR_COUNT++)) 834 | } 835 | 836 | # 用途: 远程本地登陆主机信息展示 837 | # 参数: 无 838 | ssh_login_banner() { 839 | log_info "Configure OS Local or Remote Login Banner Tips." 840 | log_info "[-] 远程SSH登录前后提示警告Banner设置" 841 | # 1.SSH登录前警告Banner提示 842 | sudo egrep -q "^\s*(banner|Banner)\s+\W+.*$" /etc/ssh/sshd_config && sudo sed -ri "s/^\s*(banner|Banner)\s+\W+.*$/Banner \/etc\/issue/" /etc/ssh/sshd_config || \ 843 | sudo echo "Banner /etc/issue" >> /etc/ssh/sshd_config 844 | sudo tee /etc/issue <<'EOF' 845 | ************************* [ 安全登陆 (Security Login) ] ************************ 846 | All activities will be monitored and reported by the security center. 847 | @wechat: Sd-LiYanJing, @Github: https://github.com/919927181/linux-initialization.git 848 | 849 | Welcome to Console Cloud Computer Service! 850 | 851 | _ooOoo_ 852 | o8888888o 853 | 88" . "88 854 | (| -_- |) 855 | O\ = /O 856 | ____/`---'\____ 857 | .' \\| |// `. 858 | / \\||| : |||// \ 859 | / _||||| -:- |||||- \ 860 | | | \\\ - /// | | 861 | | \_| ''\---/'' | | 862 | \ .-\__ `-` ___/-. / 863 | ___`. .' /--.--\ `. . __ 864 | ."" '< `.___\_<|>_/___.' >'"". 865 | | | : `- \`.;`\ _ /`;.`/ - ` : | | 866 | \ \ `-. \_ __\ /__ _/ .-` / / 867 | ======`-.____`-.___\_____/___.-`____.-'====== 868 | `=---=' 869 | 870 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 871 | 佛祖保佑 永不死机 872 | 心外无法 法外无心 873 | 874 | EOF 875 | 876 | sudo tee /etc/issue.net <<'EOF' 877 | ************************* [ 安全登陆 (Security Login) ] ************************* 878 | All activities will be monitored and reported by the security center. 879 | @wechat: Sd-LiYanJing, @Github: https://github.com/919927181/linux-initialization.git 880 | 881 | Welcome to Network Cloud Computer Service! 882 | 883 | _ooOoo_ 884 | o8888888o 885 | 88" . "88 886 | (| -_- |) 887 | O\ = /O 888 | ____/`---'\____ 889 | .' \\| |// `. 890 | / \\||| : |||// \ 891 | / _||||| -:- |||||- \ 892 | | | \\\ - /// | | 893 | | \_| ''\---/'' | | 894 | \ .-\__ `-` ___/-. / 895 | ___`. .' /--.--\ `. . __ 896 | ."" '< `.___\_<|>_/___.' >'"". 897 | | | : `- \`.;`\ _ /`;.`/ - ` : | | 898 | \ \ `-. \_ __\ /__ _/ .-` / / 899 | ======`-.____`-.___\_____/___.-`____.-'====== 900 | `=---=' 901 | 902 | 903 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 904 | 佛祖保佑 永不死机 905 | 心外无法 法外无心 906 | EOF 907 | 908 | # 2.SSH登录后提示Banner提示 909 | # Disable motd-news 910 | if [ -f /etc/default/motd-news ];then 911 | sudo cp /etc/default/motd-news ${BACKUPDIR} 912 | sudo sed -i 's/ENABLED=.*/ENABLED=0/' /etc/default/motd-news 913 | else 914 | sudo echo 'ENABLED=0' > /etc/default/motd-news 915 | fi 916 | sudo systemctl stop motd-news.timer && sudo systemctl disable motd-news.timer 917 | sudo systemctl mask motd-news.timer >/dev/null 2>&1 918 | 919 | # Disable defualt motd 920 | sudo chmod -x /etc/update-motd.d/* 921 | sudo tee /etc/update-motd.d/00-custom-header <<'EOF' 922 | #!/bin/bash 923 | #-----------------------------------------------------------------------# 924 | # System security initiate hardening tool for Ubuntu Server. 925 | # @wechat: Sd-LiYanJing, @Github: https://github.com/919927181/linux-initialization.git 926 | # 927 | #-------------------------------------------------------------------------# 928 | # Get load averages 929 | LOAD1=$(grep "" /proc/loadavg | awk '{print $1}') 930 | LOAD5=$(grep "" /proc/loadavg | awk '{print $2}') 931 | LOAD15=$(grep "" /proc/loadavg | awk '{print $3}') 932 | 933 | # Get free memory 934 | MEMORY_USED=$(free -t -m | grep "Mem" | awk '{print $3}') 935 | MEMORY_ALL=$(free -t -m | grep "Mem" | awk '{print $2}') 936 | MEMORY_PERCENTAGE=$(free | awk '/Mem/{printf("%.2f%"), $3/$2*100}') 937 | 938 | # Get system uptime 939 | UPTIME=$(grep "" /proc/uptime | cut -f1 -d.) 940 | UPTIME_DAYS=$(("${UPTIME}"/60/60/24)) 941 | UPTIME_HOURS=$(("${UPTIME}"/60/60%24)) 942 | UPTIME_MINS=$(("${UPTIME}"/60%60)) 943 | UPTIME_SECS=$(("${UPTIME}"%60)) 944 | 945 | # Get processes 946 | PROCESS=$(ps -eo user=|sort|uniq -c | awk '{print $2 " " $1 }') 947 | PROCESS_ALL=$(echo "${PROCESS}" | awk '{print $2}' | awk '{SUM += $1} END {print SUM}') 948 | PROCESS_ROOT=$(echo "${PROCESS}" | grep root | awk '{print $2}') 949 | PROCESS_USER=$(echo "${PROCESS}" | grep -v root | awk '{print $2}' | awk '{SUM += $1} END {print SUM}') 950 | 951 | # Get processors 952 | PROCESSOR_NAME=$(grep "model name" /proc/cpuinfo | cut -d ' ' -f3- | awk '{print $0}' | head -1) 953 | PROCESSOR_COUNT=$(grep -ioP 'processor\t:' /proc/cpuinfo | wc -l) 954 | 955 | # Colors 956 | G="\033[01;32m" 957 | R="\033[01;31m" 958 | D="\033[39m\033[2m" 959 | N="\033[0m" 960 | 961 | echo -e "\e[01;38;44;5m########################## 安全运维 (Security Operation) ############################\e[0m" 962 | echo -e "@wechat: Sd-LiYanJing, @Github: https://github.com/919927181/linux-initialization.git" 963 | echo -e "you have logged in to ${G}$(uname -n)${N}, login time is $(/bin/date "+%Y-%m-%d %H:%M:%S")." 964 | echo -e "your all activities will be monitored and reported by the security center.\n" 965 | echo -e "\033[33m警告:生产机能不动就别动!\033[0m\n" 966 | 967 | # 1. 打印系统信息 968 | echo -e "[System-Info]\n" 969 | echo -e " SYSTEM : $(awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release)" 970 | echo -e " KERNEL : $(uname -sr)" 971 | echo -e " UPTIME : ${UPTIME_DAYS} days ${UPTIME_HOURS} hours ${UPTIME_MINS} minutes ${UPTIME_SECS} seconds\n" 972 | echo -e " CPU : ${PROCESSOR_NAME} (${G}${PROCESSOR_COUNT}${N} vCPU)" 973 | echo -e " MEMORY : total ${MEMORY_ALL} MB, Used ${MEMORY_USED} MB, Usage rate ${G}${MEMORY_PERCENTAGE}${N}" 974 | echo -e " LOAD AVG : ${G}${LOAD1}${N} (1m), ${G}${LOAD5}${N} (5m), ${G}${LOAD15}${N} (15m)" 975 | echo -e " PROCESSES : ${G}${PROCESS_ROOT}${N} (root), ${G}${PROCESS_USER}${N} (user), ${G}${PROCESS_ALL}${N} (total)" 976 | echo -e " BASH : ${G}${BASH_VERSION}${N}\n" 977 | 978 | # 2. 打印升级通知 979 | echo -e "[Update-Notice]" 980 | stamp="/var/lib/update-notifier/updates-available" 981 | 982 | [ ! -r "$stamp" ] || cat "$stamp" 983 | 984 | find $stamp -newermt 'now-7 days' 2> /dev/null | grep -q -m 1 '.' || /usr/share/update-notifier/notify-updates-outdated 985 | 986 | echo -e "\n\033[33m警告:生产机能不动就别动!\033[0m\n" 987 | 988 | EOF 989 | # Add new motd 990 | sudo chmod +x /etc/update-motd.d/00-custom-header 991 | 992 | log_success "This operation is completed!" 993 | sleep 1 994 | 995 | } 996 | 997 | # 函数用途: 系统 GRUB 安全设置防止物理接触从grub菜单中修改密码 998 | # 函数参数: 无 999 | sec_grub_policy() { 1000 | 1001 | log_info "[${VAR_COUNT}] System GRUB security policy setting." 1002 | log_info "[-] 系统 GRUB 安全设置 (防止物理接触从grub菜单中修改密码)" 1003 | # 1.GRUB 关键文件备份 1004 | cp -a /etc/grub.d/00_header ${BACKUPDIR}/"00_header.bak.${EXEC_TIME}" 1005 | cp -a /etc/grub.d/10_linux ${BACKUPDIR}/"10_linux.bak.${EXEC_TIME}" 1006 | 1007 | # 2.设置GRUB菜单界面显示时间 1008 | sed -i -e 's|GRUB_TIMEOUT_STYLE=hidden|#GRUB_TIMEOUT_STYLE=hidden|g' -e 's|GRUB_TIMEOUT=0|GRUB_TIMEOUT=3|g' /etc/default/grub 1009 | sed -i -e 's|set timeout_style=${style}|#set timeout_style=${style}|g' -e 's|set timeout=${timeout}|set timeout=3|g' /etc/grub.d/00_header 1010 | 1011 | # 附-grub用户认证密码创建命令 1012 | #sudo grub2-mkpasswd-pbkdf2 1013 | # 输入口令: 1014 | # Reeter password:n 1015 | # PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.D3A42D2E24A2B2A62CFAB435890840E868088982B3B5EA14FB5F62BC5F0DF6E267CF1D42950A710A2539B4EA0E1D08569928427243E61E063DF2CEF34A571E6B.E7360FF876927678BD33348531B493039D9606062F7A4D9D722BDE94FF26A4B7D2B62AFDDA3F7D47EFDF46623DEAC547733B24E98630FE3961BEDA9257BAEA95 1016 | # 设置认证用户和密钥(使用grub2-mkpasswd-pbkdf2生成密钥,口令为Liyanjing) 1017 | 1018 | 1019 | tee -a /etc/grub.d/00_header <<'END' 1020 | cat <<'EOF' 1021 | # GRUB Authentication 1022 | set superusers="grub" 1023 | password_pbkdf2 grub grub.pbkdf2.sha512.10000.D3A42D2E24A2B2A62CFAB435890840E868088982B3B5EA14FB5F62BC5F0DF6E267CF1D42950A710A2539B4EA0E1D08569928427243E61E063DF2CEF34A571E6B.E7360FF876927678BD33348531B493039D9606062F7A4D9D722BDE94FF26A4B7D2B62AFDDA3F7D47EFDF46623DEAC547733B24E98630FE3961BEDA9257BAEA95 1024 | EOF 1025 | END 1026 | 1027 | # 3.设置进入正式系统不需要认证,如果进入单用户模式进行重置账号密码时需要进行认证。(高敏感数据库系统不建议下述操作) 1028 | # 在191和193 分别加入--user=grub 和 --unrestricted,此处与centos不同的是要加上--user=grub 1029 | # 191 echo "menuentry --user=grub '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/" # 如果按e进行menu菜单则需要用grub进行认证 1030 | # 192 else 1031 | # 193 echo "menuentry --unrestricted '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/" # 正常进入系统则不认证 1032 | sed -i '/echo "$title" | grub_quote/ { s/menuentry /menuentry --user=grub /;}' /etc/grub.d/10_linux 1033 | sed -i '/echo "$os" | grub_quote/ { s/menuentry /menuentry --unrestricted /;}' /etc/grub.d/10_linux 1034 | 1035 | # 4.Ubuntu 方式更新GRUB从而生成boot启动文件。 1036 | update-grub 1037 | 1038 | log_success "[${VAR_COUNT}] This operation is completed!" 1039 | sleep 1 1040 | ((VAR_COUNT++)) 1041 | } 1042 | 1043 | # 函数用途: 用户登陆安全策略设置 1044 | # 函数参数: 无 1045 | sec_login_policy () { 1046 | log_info "[${VAR_COUNT}] System user login security policy setting." 1047 | log_info "[-] 用户登陆安全策略设置." 1048 | 1049 | # 1.判断ubuntu的版本,最新的 22.04 使用的是 pam_faillock.so 模块了而非 pam_tally2.so 所以此处需要根据版本切换(坑呀)。 1050 | log_info "[-] 用户远程登录失败次数,终端操作超时设置,例如(包括root账号)用户远程连续登录失败10次锁定帐号5分钟" 1051 | release=$(lsb_release -c -s) 1052 | if [ "${release}" == "jammy" ];then 1053 | # if [ ! -f /var/run/faillock ];then mkdir -vp /var/run/faillock;fi 1054 | cp -a /etc/pam.d/common-auth ${BACKUPDIR}/"common-auth.bak.${EXEC_TIME}" 1055 | sed -ri "/^\s*auth\s.+pam_faillock.so\s+.+(\s*#.*)?\s*$/d" /etc/pam.d/common-auth 1056 | sed -ri "/pam_unix.so nullok$/a # User Login failed lock policy.\nauth [default=die] pam_faillock.so authfail silent audit dir=/var/run/faillock fail_interval=${VAR_LOGIN_FAIL_INTERVAL} deny=${VAR_LOGIN_FAIL_COUNT} unlock_time=${VAR_LOGIN_LOCK_TIME} even_deny_root root_unlock_time=${VAR_LOGIN_LOCK_TIME}\nauth sufficient pam_faillock.so authsucc" /etc/pam.d/common-auth 1057 | elif [ "${release}" == "focal" ] || [ "${release}" == "bionic" ] ;then 1058 | cp -a /etc/pam.d/login ${BACKUPDIR}/"login.bak.${EXEC_TIME}" 1059 | cp -a /etc/pam.d/sshd ${BACKUPDIR}/"sshd.bak.${EXEC_TIME}" 1060 | sed -ri "/^\s*auth\s+required\s+pam_tally2.so\s+.+(\s*#.*)?\s*$/d" /etc/pam.d/sshd 1061 | sed -ri "2a auth required pam_tally2.so deny=${VAR_LOGIN_FAIL_COUNT} unlock_time=${VAR_LOGIN_LOCK_TIME} even_deny_root root_unlock_time=${VAR_LOGIN_LOCK_TIME}" /etc/pam.d/sshd 1062 | # 宿主机控制台登陆也受到限制(可选) 1063 | # sed -ri "/^\s*auth\s+required\s+pam_tally2.so\s+.+(\s*#.*)?\s*$/d" /etc/pam.d/login 1064 | # sed -ri "2a auth required pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=600" /etc/pam.d/login 1065 | fi 1066 | 1067 | # 2.终端登陆超时时间设置 1068 | log_info "[-] 设置登录超时时间为${VAR_LOGIN_TIMEOUT}分钟 " 1069 | egrep -q "^\s*(export|)\s*TMOUT\S\w+.*$" /etc/profile && sed -ri "s/^\s*(export|)\s*TMOUT.\S\w+.*$/export TMOUT=${VAR_LOGIN_TIMEOUT}\nreadonly TMOUT/" /etc/profile || echo -e "export TMOUT=${VAR_LOGIN_TIMEOUT}\nreadonly TMOUT" >> /etc/profile 1070 | egrep -q "^\s*.*ClientAliveInterval\s\w+.*$" /etc/ssh/sshd_config && sed -ri "s/^\s*.*ClientAliveInterval\s\w+.*$/ClientAliveInterval ${VAR_LOGIN_TIMEOUT}/" /etc/ssh/sshd_config || echo "ClientAliveInterval ${VAR_LOGIN_TIMEOUT}" >> /etc/ssh/sshd_config 1071 | 1072 | log_info "[-] 解决关闭执行命令时提示:You have new mail in /var/spool/mail/root " 1073 | egrep -q "unset MAILCHECK" /etc/profile && sed -ri "s/unset MAILCHECK/unset MAILCHECK/" /etc/profile || echo -e "unset MAILCHECK" >> /etc/profile 1074 | source /etc/profile 1075 | ls -lth /var/spool/mail/ 1076 | cat /dev/null > /var/spool/mail/root 1077 | 1078 | log_success "[${VAR_COUNT}] This operation is completed!" 1079 | sleep 1 1080 | ((VAR_COUNT++)) 1081 | } 1082 | 1083 | # 函数用途: 用户终端执行的历史命令记录安全策略设置 1084 | # 函数参数: 无 1085 | sec_historypolicy () { 1086 | 1087 | log_info "[${VAR_COUNT}]. System user shell command record security policy setting." 1088 | # 1.历史命令条数限制以及历史命令输出文件 1089 | log_info "[-] 用户终端执行的历史命令记录." 1090 | 1091 | egrep -q "^HISTSIZE\W\w+.*$" /etc/profile && sed -ri "s/^HISTSIZE\W\w+.*$/HISTSIZE=${VAR_HISTSIZE}/" /etc/profile || echo "HISTSIZE=${VAR_HISTSIZE}" >> /etc/profile 1092 | sudo tee /etc/profile.d/history-record.sh <<'EOF' 1093 | # 历史命令执行记录文件路径. 1094 | LOGTIME=$(date +%Y%m%d) 1095 | export HISTFILE="/var/log/.history/${USER}.${LOGTIME}.history" 1096 | if [ ! -f ${HISTFILE} ];then 1097 | touch ${HISTFILE} 1098 | fi 1099 | chmod 600 ${HISTFILE} 1100 | # 历史命令执行文件大小记录设置. 1101 | HISTFILESIZE=128 1102 | HISTTIMEFORMAT="%F_%T $(whoami)#$(who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'):" 1103 | EOF 1104 | 1105 | # 2.执行权限赋予与及时生效 1106 | chmod a+x /etc/profile.d/history-record.sh 1107 | source /etc/profile.d/history-record.sh 1108 | 1109 | log_success "[${VAR_COUNT}]. This operation is completed!" 1110 | sleep 1 1111 | ((VAR_COUNT++)) 1112 | } 1113 | 1114 | # 函数用途: 用于锁定或者删除多余的系统账户 1115 | # 函数参数: 无 1116 | sec_usercheck () { 1117 | log_info "[${VAR_COUNT}] Lock or delete redundant system accounts." 1118 | log_info "[-] 用于锁定或者删除多余的系统账户." 1119 | cp -a /etc/shadow /${BACKUPDIR}/"shadow.bak.${EXEC_TIME}" 1120 | local defaultuser 1121 | defaultuser=(root daemon bin sys games man lp mail news uucp proxy www-data backup list irc gnats nobody systemd-network systemd-resolve systemd-timesync messagebus syslog _apt tss uuidd tcpdump landscape pollinate usbmux sshd systemd-coredump sync _rpc _chrony statd ubuntu ) 1122 | for i in $(cat /etc/passwd | cut -d ":" -f 1,7);do 1123 | flag=0; name=${i%%:*}; terminal=${i##*:} 1124 | if [[ "${terminal}" == "/bin/bash" || "${terminal}" == "/bin/sh" ]];then 1125 | log_warning "${name} 用户,shell终端为 /bin/bash 或者 /bin/sh" 1126 | fi 1127 | for j in ${defaultuser[@]};do 1128 | if [[ "${name}" == "${j}" ]];then 1129 | flag=1 1130 | break; 1131 | fi 1132 | done 1133 | if [[ $flag -eq 0 ]];then 1134 | log_warning "${name} 为非默认用户, 请排查是否为内部人员创建." 1135 | fi 1136 | done 1137 | 1138 | # 请输入是否删除无用服务账号以及锁定服务账号登陆,缺省为N 1139 | #read -t 30 -p "你确定要删除无用的服务账号吗? (Y/N) : " VERIFY 1140 | #if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then 1141 | # userdel -r lxd && groupdel lxd 1142 | # -l锁定用户的密码使其不能被更改,-u 解锁 1143 | passwd -l lxd&>/dev/null 2&>/dev/null;passwd -l adm&>/dev/null 2&>/dev/null; passwd -l daemon&>/dev/null 2&>/dev/null; passwd -l bin&>/dev/null 2&>/dev/null; passwd -l sys&>/dev/null 2&>/dev/null; passwd -l lp&>/dev/null 2&>/dev/null; passwd -l uucp&>/dev/null 2&>/dev/null; passwd -l nuucp&>/dev/null 2&>/dev/null; passwd -l smmsplp&>/dev/null 2&>/dev/null; passwd -l mail&>/dev/null 2&>/dev/null; passwd -l operator&>/dev/null 2&>/dev/null; passwd -l games&>/dev/null 2&>/dev/null; passwd -l gopher&>/dev/null 2&>/dev/null; passwd -l ftp&>/dev/null 2&>/dev/null; passwd -l nobody&>/dev/null 2&>/dev/null; passwd -l nobody4&>/dev/null 2&>/dev/null; passwd -l noaccess&>/dev/null 2&>/dev/null; passwd -l listen&>/dev/null 2&>/dev/null; passwd -l webservd&>/dev/null 2&>/dev/null; passwd -l rpm&>/dev/null 2&>/dev/null; passwd -l dbus&>/dev/null 2&>/dev/null; passwd -l avahi&>/dev/null 2&>/dev/null; passwd -l mailnull&>/dev/null 2&>/dev/null; passwd -l nscd&>/dev/null 2&>/dev/null; passwd -l vcsa&>/dev/null 2&>/dev/null; passwd -l rpc&>/dev/null 2&>/dev/null; passwd -l rpcuser&>/dev/null 2&>/dev/null; passwd -l nfs&>/dev/null 2&>/dev/null; passwd -l sshd&>/dev/null 2&>/dev/null; passwd -l pcap&>/dev/null 2&>/dev/null; passwd -l ntp&>/dev/null 2&>/dev/null; passwd -l haldaemon&>/dev/null 2&>/dev/null; passwd -l distcache&>/dev/null 2&>/dev/null; passwd -l webalizer&>/dev/null 2&>/dev/null; passwd -l squid&>/dev/null 2&>/dev/null; passwd -l xfs&>/dev/null 2&>/dev/null; passwd -l gdm&>/dev/null 2&>/dev/null; passwd -l sabayon&>/dev/null 2&>/dev/null; passwd -l named&>/dev/null 2&>/dev/null 1144 | #fi 1145 | 1146 | log_success "[${VAR_COUNT}] This operation is completed!" 1147 | sleep 1 1148 | ((VAR_COUNT++)) 1149 | } 1150 | 1151 | 1152 | # 函数用途: 用户密码复杂性策略设置 (密码过期周期0~90、到期前15天提示、密码长度至少12、复杂度设置至少有一个大小写、数字、特殊字符、密码三次不能一样、尝试次数为三次) 1153 | # 函数参数: 无 1154 | sec_userpass_policy () { 1155 | 1156 | log_info "[${VAR_COUNT}] System account password policy setting." 1157 | log_info "[-] 用户密码复杂性策略设置。注意:需要使用管理员,否则无权限更改" 1158 | # 备注:login.defs 只会对新创建的用户起作用,已创建的用户需要使用chage命令来修改。 1159 | 1160 | cp -a /etc/login.defs ${BACKUPDIR}/"login.defs.${EXEC_TIME}" 1161 | cp -a /etc/pam.d/common-password ${BACKUPDIR} 1162 | 1163 | # 启用成功登录的日志记录 1164 | egrep -q "^\s*LOG_OK_LOGINS\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)LOG_OK_LOGINS\s+\S*(\s*#.*)?\s*$/LOG_OK_LOGINS ${VAR_LOG_OK_LOGINS}/" /etc/login.defs || echo "LOG_OK_LOGINS ${VAR_LOG_OK_LOGINS}" >> /etc/login.defs 1165 | # 禁止没有主目录的用户登录。 1166 | egrep -q "^\s*DEFAULT_HOME\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)DEFAULT_HOME\s+\S*(\s*#.*)?\s*$/DEFAULT_HOME ${VAR_DEFAULT_HOME}/" /etc/login.defs || echo "DEFAULT_HOME ${VAR_DEFAULT_HOME}" >> /etc/login.defs 1167 | # 删除用户时禁止同步删除用户组 1168 | egrep -q "^\s*USERGROUPS_ENAB\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)USERGROUPS_ENAB\s+\S*(\s*#.*)?\s*$/USERGROUPS_ENAB ${VAR_USERGROUPS_ENAB}/" /etc/login.defs || echo "USERGROUPS_ENAB ${VAR_USERGROUPS_ENAB}" >> /etc/login.defs 1169 | 1170 | #PASS_MIN_DAYS 指两次修改密码的时间间隔。0时表示任何时候都可更改密码。 1171 | egrep -q "^\s*PASS_MIN_DAYS\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_MIN_DAYS\s+\S*(\s*#.*)?\s*$/PASS_MIN_DAYS ${PASS_MIN_DAYS}/" /etc/login.defs || echo "PASS_MIN_DAYS ${PASS_MIN_DAYS}" >> /etc/login.defs 1172 | egrep -q "^\s*PASS_MAX_DAYS\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_MAX_DAYS\s+\S*(\s*#.*)?\s*$/PASS_MAX_DAYS ${PASS_MAX_DAYS}/" /etc/login.defs || echo "PASS_MAX_DAYS ${{PASS_MAX_DAYS}}" >> /etc/login.defs 1173 | egrep -q "^\s*PASS_WARN_AGE\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_WARN_AGE\s+\S*(\s*#.*)?\s*$/PASS_WARN_AGE ${PASS_WARN_AGE}/" /etc/login.defs || echo "PASS_WARN_AGE ${PASS_WARN_AGE}" >> /etc/login.defs 1174 | egrep -q "^\s*PASS_MIN_LEN\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)PASS_MIN_LEN\s+\S*(\s*#.*)?\s*$/PASS_MIN_LEN ${PASS_MIN_LEN}/" /etc/login.defs || echo "PASS_MIN_LEN ${PASS_MIN_LEN}" >> /etc/login.defs 1175 | egrep -q "^\s*ENCRYPT_METHOD\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)ENCRYPT_METHOD\s+\S*(\s*#.*)?\s*$/ENCRYPT_METHOD ${VAR_PASS_ENCRYPT}/" /etc/login.defs || echo "ENCRYPT_METHOD ${VAR_PASS_ENCRYPT}" >> /etc/login.defs 1176 | 1177 | egrep -q "^password\s.+pam_cracklib.so\s+\w+.*$" /etc/pam.d/common-password && sed -ri "/^password\s.+pam_cracklib.so/{s/pam_cracklib.so\s+\w+.*$/pam_cracklib.so retry=${VAR_PASS_RETRY} difok=${VAR_PASS_DIFOK} minlen=${PASS_MIN_LEN} minclass=${VAR_PASS_MINCLASS} ucredit=${VAR_PASS_UCREDIT} lcredit=${VAR_PASS_LCREDIT} dcredit=${VAR_PASS_DCREDIT} ocredit=${VAR_PASS_OCREDIT}/g;}" /etc/pam.d/common-password 1178 | egrep -q "^password\s.+pam_unix.so\s+\w+.*$" /etc/pam.d/common-password && sed -ri "/^password\s.+pam_unix.so/{s/pam_unix.so\s+\w+.*$/pam_unix.so obscure use_authtok try_first_pass sha512 remember=${VAR_PASS_REMEMBER}/g;}" /etc/pam.d/common-password 1179 | 1180 | log_success "[${VAR_COUNT}] This operation is completed!" 1181 | sleep 1 1182 | ((VAR_COUNT++)) 1183 | } 1184 | 1185 | 1186 | # 函数用途: 系统sshd服务安全策略设置(符合等保三级要求) 1187 | # 函数参数: 无 1188 | sec_sshd_policy () { 1189 | log_info "[${VAR_COUNT}]. System sshd service security policy setting." 1190 | log_info "[-] 系统sshd服务安全策略设置." 1191 | cp /etc/ssh/sshd_config ${BACKUPDIR}/"sshd_config.bak.${EXEC_TIME}" 1192 | 1193 | # 1.启用严格模式 1194 | sudo egrep -q "^\s*StrictModes\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*StrictModes\s+.+$/StrictModes yes/" /etc/ssh/sshd_config || echo "StrictModes yes" >> /etc/ssh/sshd_config 1195 | 1196 | # 2.禁用X11转发及端口转发 1197 | sudo egrep -q "^\s*X11Forwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*X11Forwarding\s+.+$/X11Forwarding no/" /etc/ssh/sshd_config || echo "X11Forwarding no" >> /etc/ssh/sshd_config 1198 | sudo egrep -q "^\s*X11UseLocalhost\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*X11UseLocalhost\s+.+$/X11UseLocalhost yes/" /etc/ssh/sshd_config || echo "X11UseLocalhost yes" >> /etc/ssh/sshd_config 1199 | sudo egrep -q "^\s*AllowTcpForwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*AllowTcpForwarding\s+.+$/AllowTcpForwarding no/" /etc/ssh/sshd_config || echo "AllowTcpForwarding no" >> /etc/ssh/sshd_config 1200 | sudo egrep -q "^\s*AllowAgentForwarding\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*AllowAgentForwarding\s+.+$/AllowAgentForwarding no/" /etc/ssh/sshd_config || echo "AllowAgentForwarding no" >> /etc/ssh/sshd_config 1201 | # 3.关闭禁用用户的 .rhosts 文件 ~/.ssh/.rhosts 来做为认证: 缺省 IgnoreRhosts yes 1202 | egrep -q "^(#)?\s*IgnoreRhosts\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^(#)?\s*IgnoreRhosts\s+.+$/IgnoreRhosts yes/" /etc/ssh/sshd_config || echo "IgnoreRhosts yes" >> /etc/ssh/sshd_config 1203 | 1204 | log_success "[${VAR_COUNT}]. This operation is completed!" 1205 | 1206 | log_info "提醒:请执行下面的安全设置,如更改ssh端口号,禁止root远程登录等" 1207 | sleep 1 1208 | ((VAR_COUNT++)) 1209 | } 1210 | 1211 | 1212 | # 函数用途: 解决普通用户定时任务无法定时执行问题 1213 | # 函数参数: 无 1214 | problem_usercrond () { 1215 | log_info "[${VAR_COUNT}]. Solve the problem that regular user scheduled tasks cannot be executed regularly." 1216 | 1217 | log_info "[-] 解决普通用户定时任务无法定时执行" 1218 | cp -a /etc/pam.d/common-session-noninteractive ${BACKUPDIR}/"common-session-noninteractive.bak.${EXEC_TIME}" 1219 | if ! grep -qi "session [success=1 default=ignore] pam_succeed_if.so" /etc/pam.d/common-session-noninteractive;then 1220 | linenumber=`expr $(egrep -n "pam_unix.so\s$" /etc/pam.d/common-session-noninteractive | cut -f 1 -d ":") - 2` 1221 | sudo sed -ri "${linenumber}a session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid" /etc/pam.d/common-session-noninteractive 1222 | fi 1223 | 1224 | log_success "[${VAR_COUNT}] This operation is completed!" 1225 | sleep 1 1226 | ((VAR_COUNT++)) 1227 | } 1228 | 1229 | 1230 | # 函数用途: 解决 ubuntu multipath add missing path 错误 1231 | # 函数参数: 无 1232 | problem_multipath () { 1233 | log_info "[${VAR_COUNT}]. Solve the problem that ubuntu multipath add missing path error." 1234 | 1235 | # 1.配置多路径后端磁盘 1236 | log_info "[-] 解决普通用户定时任务无法后台定时执行问题" 1237 | cp -a /etc/multipath.conf ${BACKUPDIR}/"multipath.conf.bak.${EXEC_TIME}" 1238 | if ! grep -qi "blacklist" /etc/multipath.conf;then 1239 | tee -a /etc/multipath.conf <<'EOF' 1240 | blacklist { 1241 | devnode "^sda" 1242 | } 1243 | EOF 1244 | fi 1245 | # 2.重启multipath-tools服务 1246 | sudo systemctl restart multipath-tools.service 1247 | 1248 | log_success "[${VAR_COUNT}] This operation is completed!" 1249 | sleep 1 1250 | ((VAR_COUNT++)) 1251 | } 1252 | 1253 | # 函数用途: 系统防火墙策略设置, 建议操作完成后重启计算机. 1254 | # 函数参数: 无 1255 | sec_firewall_policy() { 1256 | log_info "[${VAR_COUNT}]. System Firewall security policy setting." 1257 | 1258 | log_info "[-] 启用 ufw 系统防火墙..." 1259 | sudo ufw status | grep -q "inactive" 1260 | if [ $? == 0 ];then 1261 | sudo systemctl start ufw.service 1262 | sudo echo -e "y\n" | ufw enable 1263 | sudo systemctl enable ufw.service 1264 | fi 1265 | 1266 | log_info "防火墙端口放行ssh" 1267 | sudo ufw allow 22/tcp && sudo ufw allow ${VAR_SSH_PORT}/tcp 1268 | 1269 | log_success "[${VAR_COUNT}] This operation is completed!" 1270 | sleep 1 1271 | ((VAR_COUNT++)) 1272 | 1273 | log_info "[-] \n系统将在5s后重启。" 1274 | shutdown -r -t 5 1275 | 1276 | } 1277 | 1278 | # 用途: 切换用户日志记录和切换命令更改名称为SU(可选) 1279 | # 参数: 无 1280 | sec_su_policy() { 1281 | log_info "[${VAR_COUNT}] Rename su command to SU command." 1282 | 1283 | log_info "[-] 将用户切换命令更改名称为 SU " 1284 | # 1.su 命令切换记录 1285 | if [ ! -f ${SU_LOG_FILE} ];then touch ${SU_LOG_FILE};fi 1286 | egrep -q "^(\s*)SULOG_FILE\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)SULOG_FILE\s+\S*(\s*#.*)?\s*$/\SULOG_FILE ${SU_LOG_FILE}" /etc/login.defs || echo "SULOG_FILE ${SU_LOG_FILE}" >> /etc/login.defs 1287 | # egrep -q "^\s*SU_NAME\s+\S*(\s*#.*)?\s*$" /etc/login.defs && sed -ri "s/^(\s*)SU_NAME\s+\S*(\s*#.*)?\s*$/\SU_NAME SU/" /etc/login.defs || echo "SU_NAME SU" >> /etc/login.defs 1288 | # mv /usr/bin/su /usr/bin/SU 1289 | 1290 | log_info "[-] 配置不允许指定组使用su切换 " 1291 | egrep -q "^(\s*).+auth\s.+pam_wheel.so deny\s+\w+.*$" /etc/pam.d/su && sed -ri "/^(\s*).+auth\s.+pam_wheel.so deny/{s/^(\s*).+auth\s.+pam_wheel.so\s+\w+.*$/auth required pam_wheel.so deny group=app /g;}" /etc/pam.d/su 1292 | 1293 | log_success "[${VAR_COUNT}] This operation is completed!" 1294 | sleep 1 1295 | ((VAR_COUNT++)) 1296 | } 1297 | 1298 | 1299 | ## 名称: Os_Security_FilePermissions 1300 | ## 用途: 操作系统安全加固配置脚本(符合等保要求-三级要求)-4-设置或恢复文件or目录权限 1301 | ## 参数: 无 1302 | Os_Security_FilePermissions () { 1303 | 1304 | log_info "[-] 设置/恢复重要目录和文件的权限" 1305 | touch /etc/security/opasswd && chown root:root /etc/security/opasswd && chmod 600 /etc/security/opasswd 1306 | find /home -name authorized_keys -exec chmod 600 {} \; 1307 | chmod 600 ~/.ssh/authorized_keys 2&>/dev/null 1308 | chmod 0600 /etc/ssh/sshd_config 1309 | chmod 644 /etc/group /etc/services 1310 | chmod 700 /etc/inetd.conf&>/dev/null 2&>/dev/null; 1311 | chmod 755 /etc /etc/passwd /etc/shadow /etc/security /etc/rc*.d 1312 | 1313 | # 提高系统安全,更改其执行权限,解决Polkit 权限提升漏洞 1314 | chmod 0755 /usr/bin/pkexec 1315 | 1316 | } 1317 | 1318 | ## 名称: Os_Change_SShPort 1319 | ## 用途: 更改ssh端口号,不输入参数则使用defaultport 1320 | ## 参数: $1(端口号) 或 无 1321 | Change_SShPort() { 1322 | 1323 | log_info "[-] 更改ssh默认端口,提高安全性..." 1324 | 1325 | # 判断是否输入了参数 1326 | if [ -n "$1" ];then 1327 | # echo "第一个参数$1" 1328 | VAR_SSH_PORT=${1} 1329 | fi 1330 | 1331 | # 1. ssh配置文件去除原来的ssh登陆端口 1332 | arr_port=$(cat /etc/ssh/sshd_config | grep ^Port.* | awk '{print $2}' ) 1333 | for port in ${arr_port[@]} 1334 | do 1335 | log_info "[-] 正在去除ssh端口:$port" 1336 | sudo ufw delete allow ${port}/tcp 1337 | sleep 2 1338 | 1339 | done 1340 | #这里注销掉所有以Port开头的。/d是删除所有以prot开头的行 1341 | sudo sed -i 's/^Port/#Port/g' /etc/ssh/sshd_config 1342 | #sed -i '/^Port/d' /etc/ssh/sshd_config 1343 | 1344 | # 2. ssh配置文件加入新端口 1345 | sudo sed -i "/#Port 22/a\Port ${VAR_SSH_PORT}" /etc/ssh/sshd_config 1346 | 1347 | # 3. 添加sshd服务20211端口到SELinux,已禁用了SELinux,就不用添加了 1348 | #semanage port -m -t VAR_SSH_PORT_t -p tcp 20211 1349 | 1350 | # 4. 防火墙端口放行 1351 | sudo ufw allow ${VAR_SSH_PORT}/tcp 1352 | sudo ufw delete allow 22/tcp > /dev/null 2>&1 1353 | sudo ufw reload 1354 | 1355 | # 5. 重启ssd服务 1356 | systemctl restart sshd 1357 | 1358 | log_info "[-] 设置完毕,请使用ssh端口 ${VAR_SSH_PORT} 登陆 " 1359 | 1360 | } 1361 | 1362 | ## 用途: 执行更改ssh端口号 1363 | run_sec_change_sshport() { 1364 | 1365 | read -r -p "Do you agree change the SSH port to ${VAR_SSH_PORT} ? If not, please enter another port? [Y/n] " -t 30 input_ssh_yn 1366 | case $input_ssh_yn in 1367 | [yY][eE][sS]|[yY]) 1368 | echo -e "\033[32mYes, continue...\033[0m" 1369 | Change_SShPort 1370 | ;; 1371 | [nN][oO]|[nN]) 1372 | while true; do 1373 | read -p "建议端口从40101开始,请输入 ssh 端口号:" VAR_SSH_PORT 1374 | isValidNum ${VAR_SSH_PORT} 1375 | [ $? -eq 0 ] && break 1376 | done 1377 | Change_SShPort ${VAR_SSH_PORT} 1378 | ;; 1379 | *) 1380 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1381 | exit 1 1382 | ;; 1383 | esac 1384 | 1385 | log_warning "[-!] 不要将 sshd 对 Internet 开放登陆权限,尽量将SSH局限在几个小范围内的 IP,请你另行设置!" 1386 | } 1387 | 1388 | 1389 | ## 名称: Disk_LvsManager 1390 | ## 用途: CentOS7 操作系统磁盘 LVS 逻辑卷添加与配置(扩容流程) - 请按需调用执行 1391 | ## 参数: 无 1392 | Disk_lvsManager () { 1393 | echo -e "\n 分区信息:" 1394 | sudo df -Th 1395 | sudo lsblk 1396 | echo -e "\n 磁盘信息:" 1397 | sudo fdisk -l 1398 | echo -e "\n PV物理卷查看:" 1399 | sudo pvscan 1400 | echo -e "\n vgs虚拟卷查看:" 1401 | sudo vgs 1402 | echo -e "\n lvscan逻辑卷扫描:" 1403 | sudo lvscan 1404 | echo -e "\n 分区扩展" 1405 | echo -e "CentOS \n lvextend -L +24G /dev/centos/root" 1406 | echo "lsblk" 1407 | echo -e "Centos \n # xfs_growfs /dev/mapper/centos-root" 1408 | } 1409 | 1410 | 1411 | ## 名称: add_group 1412 | ## 用途:创建普通用户的所属组 1413 | ## 参数: 无 1414 | add_group() { 1415 | # create group if not exists 1416 | sudo egrep "^$VAR_GROUP_NAME" /etc/group >& /dev/null 1417 | if [ $? -ne 0 ] 1418 | then 1419 | sudo groupadd --gid 5001 $VAR_GROUP_NAME 1420 | fi 1421 | } 1422 | 1423 | ## 名称: add_group 1424 | ## 用途:创建普通用户的所属组 1425 | ## 参数: $1(用户名) 或 无 1426 | add_user() { 1427 | 1428 | log_info "[-] 创建一个拥有管理权限的普通用户,执行sodu命令需要输入密码..." 1429 | 1430 | # 判断是否输入了参数 1431 | if [ -n "$1" ];then 1432 | # echo "第一个参数$1" 1433 | VAR_USER_NAME=${1} 1434 | fi 1435 | 1436 | # 1.添加用户,并指定用户id,组id, 1437 | sudo useradd --home-dir /home/$VAR_USER_NAME --create-home --uid 5001 \ 1438 | --gid 5001 --shell /bin/bash --skel /dev/null $VAR_USER_NAME 1439 | 1440 | # 2.设置用户密码 1441 | sudo echo "${VAR_USER_NAME}:${VAR_USER_PASSWD}" | chpasswd 1442 | 1443 | # 3.给普通用户授权sudo,先删除后添加 1444 | cp /etc/sudoers ${BACKUPDIR}/"sudoers.bak.${EXEC_TIME}" 1445 | sudo chmod -v u+w /etc/sudoers 1446 | sudo sed -i '/^'"$VAR_USER_NAME"'.*$/d' /etc/sudoers 1447 | 1448 | # 允许用户your_user执行sudo命令,不需要输入密码 1449 | tmp_str="$VAR_USER_NAME ALL=(ALL) NOPASSWD:ALL" 1450 | if [ "$VAR_FLAG_SUDO_NEEDPWD" -eq 1 ]; then 1451 | #echo "num等于1" 1452 | tmp_str="$VAR_USER_NAME ALL=(ALL) ALL" 1453 | fi 1454 | 1455 | sudo sed -i "/^root.*$/a ${tmp_str}" /etc/sudoers 1456 | sudo chmod -v u-w /etc/sudoers 1457 | 1458 | # 4.将普通用户加入到root组、docker用户组 1459 | sudo usermod -a -G root $VAR_USER_NAME 1460 | sudo usermod -a -G docker $VAR_USER_NAME 1461 | 1462 | log_info "[-] 一个拥有管理权限的普通用户 $VAR_USER_NAME 已创建完毕,记得更改其密码哦 " 1463 | } 1464 | 1465 | ## 名字:run_add_user 1466 | ## 用途:执行添加用户方法 1467 | ## 参数:无 1468 | run_add_user() { 1469 | 1470 | # create group if not exists 1471 | add_group 1472 | 1473 | read -p "创建拥有管理权限的普通用户 ${VAR_USER_NAME} (直接回车键),若自定义名请输入:" input_user_name 1474 | # 若没有输入,则使用默认值 1475 | if [ -z "$input_user_name" ];then 1476 | input_user_name=${VAR_USER_NAME} 1477 | fi 1478 | 1479 | # create user if not exists 1480 | sudo egrep "^$input_user_name" /etc/passwd >& /dev/null 1481 | if [ $? -ne 0 ]; then 1482 | add_user ${input_user_name} 1483 | else 1484 | log_warning "用户 ${input_user_name} 已存在,无需重复创建 " 1485 | # 将普通用户加入到root组、docker用户组 1486 | sudo usermod -a -G root $VAR_USER_NAME 1487 | sudo usermod -a -G docker $VAR_USER_NAME 1488 | fi 1489 | 1490 | } 1491 | 1492 | ## 名字:Force_UserNextLogin_ChangePwd 1493 | ## 用途:更改用户密码以及失效策略 1494 | ## 参数: 无 1495 | Force_UserNextLogin_ChangePwd() { 1496 | 1497 | log_info "[-] 1.正在重置 ${VAR_USER_NAME} 用户的密码... " 1498 | sudo echo "${VAR_USER_NAME}:${VAR_USER_PASS}" | chpasswd 1499 | 1500 | read -r -p "你确定要设置 ${VAR_USER_NAME} 用户的密码失效策略吗? [Y/n] " -t 30 input_uname_yn 1501 | case $input_uname_yn in 1502 | [yY][eE][sS]|[yY]) 1503 | echo -e "\033[32mYes, continue...\033[0m" 1504 | chage -d 0 -m 0 -M 90 -W 15 ${VAR_USER_NAME} && passwd --expire ${VAR_USER_NAME} 1505 | ;; 1506 | [nN][oO]|[nN]) 1507 | echo -e "\033[32mNo, continue...\033[0m" 1508 | ;; 1509 | *) 1510 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1511 | exit 1 1512 | ;; 1513 | esac 1514 | } 1515 | 1516 | 1517 | 1518 | ## 名字:Permit_RootSshLogin 1519 | ## 用途:禁止或允许root用户ssh远程登陆,等保三级要求禁止root远程登陆 1520 | ## 参数: 无 1521 | Root_NoLogin() { 1522 | 1523 | read -r -p "禁止root远程登陆前,普通用户你已创建好了吗? [Y/n] " -t 30 input_rootlogin_yn 1524 | case $input_rootlogin_yn in 1525 | [yY][eE][sS]|[yY]) 1526 | log_info "[-] yes 已创建普通用户,继续禁止root用户ssh远程登陆... " 1527 | sudo egrep -q "^\s*PermitRootLogin\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^\s*PermitRootLogin\s+.+$/PermitRootLogin no/" /etc/ssh/sshd_config || echo "PermitRootLogin no" >> /etc/ssh/sshd_config 1528 | sudo systemctl restart sshd 1529 | ;; 1530 | [nN][oO]|[nN]) 1531 | log_info "[-] no 没创建普通用户,还不能禁止root远程登陆... " 1532 | ;; 1533 | *) 1534 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1535 | exit 1 1536 | ;; 1537 | esac 1538 | 1539 | } 1540 | 1541 | sec_permit_root_remotelogin() { 1542 | 1543 | read -r -p "你是想禁止还是允许root用户ssh远程登陆? [Y禁止/n允许] " -t 30 input_rootlogin_yn 1544 | case $input_rootlogin_yn in 1545 | [yY][eE][sS]|[yY]) 1546 | Root_NoLogin 1547 | ;; 1548 | [nN][oO]|[nN]) 1549 | log_info "[-] 允许root用户ssh远程登陆... " 1550 | sudo egrep -q "^\s*PermitRootLogin\s+.+$" /etc/ssh/sshd_config && sed -ri "s/^\s*PermitRootLogin\s+.+$/PermitRootLogin yes/" /etc/ssh/sshd_config || echo "PermitRootLogin yes" >> /etc/ssh/sshd_config 1551 | sudo systemctl restart sshd 1552 | ;; 1553 | *) 1554 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1555 | exit 1 1556 | ;; 1557 | esac 1558 | 1559 | } 1560 | 1561 | ## 名字:Trash_Clear 1562 | ## 用途:清空回收站,清除历史*.gz日志 1563 | ## 参数: 无 1564 | Trash_Clear() { 1565 | 1566 | log_info "[-] (1)清空回收站... " 1567 | 1568 | # 附-如何防止rm误删数据,1)为rm设置了别名,2)放弃使用rm改用mv\find ,3)不删除,移动到回收站,4)不要这样用rm -fr /opt/* 正确做法是先切换到指定目录下再删除 1569 | # 查看rm别名# alias rm ,默认设置的别名 # alias rm='rm -i' rm默认开启了alias保护,在删除之前会提示是否删除。 1570 | # 删除以前定义rm的别名。 1571 | #unalias rm > /dev/null 2>&1 1572 | #alias rm='rm -i' 1573 | 1574 | # 删除家目录回收站中的文件,即清空垃圾桶 1575 | find ~/.trash/* -delete 2> /dev/null 1576 | # 删除其他用户(家目录)中的回收站中的文件目录 1577 | find /home/ -type d -name .trash -exec find {} -delete \; 1578 | 1579 | log_info "[-] (2)清理log日志... " 1580 | find /var/log -name "*.gz" -delete 1581 | find /var/log -name "*log.*" -delete 1582 | find /var/log -name "vmware-*.*.log" -delete 1583 | find /var/log -name "*.log" -exec truncate -s 0 {} \; 1584 | find /var/log -name "system@*" -delete 1585 | find /var/log -name "user-1000@*" -delete 1586 | find /tmp/* -delete 2> /dev/null 1587 | 1588 | log_warning "[-!] 询问要不要去掉回收站机制(测试机不需要回收站)..." 1589 | 1590 | echo -e -n "\033[31m\n你是否要去掉回收站机制吗? [Y去掉/n保留]:\033[0m" 1591 | read -t 30 input_trash_yn 1592 | case $input_trash_yn in 1593 | [yY][eE][sS]|[yY]) 1594 | unalias rm > /dev/null 2>&1 1595 | alias rm='rm -i' 1596 | ;; 1597 | [nN][oO]|[nN]) 1598 | unalias rm > /dev/null 2>&1 1599 | alias rm='sh /usr/local/bin/remove.sh' 1600 | ;; 1601 | *) 1602 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 1603 | exit 1 1604 | ;; 1605 | esac 1606 | } 1607 | 1608 | 1609 | # 函数用途: 删除安全加固过程临时文件清理为基线镜像做准备 1610 | # 函数参数: 无 1611 | system_clean () { 1612 | log_info "Solve the problem that regular user scheduled tasks cannot be executed regularly." 1613 | log_info "[-] 删除安全加固过程临时文件清理为基线镜像做准备" 1614 | 1615 | log_info "[-] 删除潜在威胁文件 " 1616 | sudo find / -maxdepth 3 -name hosts.equiv | xargs rm -rf 1617 | sudo find / -maxdepth 3 -name .netrc | xargs rm -rf 1618 | sudo find / -maxdepth 3 -name .rhosts | xargs rm -rf 1619 | 1620 | log_info "[-] 清理安装软件缓存" 1621 | # /var/log/apt/ 1622 | sudo apt clean all 1623 | sudo apt-get autoclean -y 1624 | sudo apt-get autoremove -y 1625 | sudo find /var/log/apt/ -type f -delete 1626 | 1627 | log_info "[-] 清理系统回收站及日志缓存文件" 1628 | # ~/.trash/ 1629 | sudo find ~/.trash/* -delete 1630 | sudo find /home/ -type d -name .trash -exec find {} -delete \; 1631 | 1632 | # /var/cache/fontconfig/ 1633 | sudo find /var/cache/fontconfig -type f -delete 1634 | 1635 | # /var/backups/ 1636 | sudo find /var/backups -type f -delete 1637 | 1638 | # /var/log/journal/ 1639 | sudo find /var/log/journal/* 1640 | sudo systemctl restart systemd-journald.service 1641 | 1642 | # /var/log 1643 | sudo find /var/log -name "vmware-*.*.log" -name "*.log-*" -name "*.gz" -name "*log.*" -delete 1644 | sudo find /var/log -type f -name "*log" -exec truncate -s 0 {} \; 1645 | sudo find /tmp/* -delete 1646 | 1647 | log_success "This operation is completed!" 1648 | } 1649 | 1650 | ## 打印出选择项 1651 | cmd_info_print() { 1652 | 1653 | echo -e "\033[32m 1654 | ==========================请选择要操作的项:========================== 1655 | # [0] 创建SWAP交换分区 1656 | # [1] 网络连通性检测(输入目标ip或域名) 1657 | # <11> 全局配置DNS(若能ping通,就没必要配置全局DNS) 1658 | # [2] 设置国内源(这里设为阿里,自行更改其他源) 1659 | # <21> 内核版本升级【生产机慎重、生产机慎重,若操作事前备份重要数据】 1660 | # <22> 安装常用软件(如htop,ncdu比du性能强...) 1661 | # <23> 一键卸载或禁用多余的软件包: 1662 | # + 1.禁用烦人的apport错误报告; 2.非云的环境下,禁用或者卸载多余的cloud-init软件及其服务; 1663 | # + 3.在系统启动时禁用debug-shell服务 1664 | # [3] 一键进行系统优化、安全加固: 1665 | # + <31> 系统的最大文件打开数限制 1666 | # + <32> 系统内核参数优化(含关闭ipv6) 1667 | # + <33> 主机时区设为东8区 1668 | # + <34> 禁用ctrl+alt+del重启系统 1669 | # + <35> 设置文件删除回收站别名(防止误删文件) 1670 | # + < > 系统安全加固(等保三级检查项)如下: 1671 | # ++ <36> 用户口令策略(密码过期90天、到期前15天提示、密码长度至少15等) 1672 | # ++ <37> sshd服务安全策略设置 1673 | # ++ <38> GRUB 安全设置 1674 | # ++ <39> 开启防火墙、禁用SELINUX等更多设置,然后重启主机 1675 | # [4] 一键设置登陆有关的 1676 | # + <41> 登陆前和后的banner主机信息展示 1677 | # + <42> 用户登陆安全策略设置,如登录超时时间 1678 | # + <43> 用于锁定或者删除多余的系统账户 1679 | # + <44> 用户终端执行的历史命令记录安全策略设置 1680 | # <45> 切换用户日志记录和切换命令更改名称为SU(可选,一键设置不含此项) 1681 | # <46> 禁止或允许root用户远程登陆(等保要求禁止root远程登陆,一键设置不含此项) 1682 | # 1683 | # [5] 更改ssh端口号(等保要求不用默认22端口,缺省改为40107) 1684 | # [6] 创建一个普通用户($VAR_USER_NAME,拥有管理权限,执行sodu命令时需要输入密码) 1685 | # 1686 | # [7] 使用Chrony配置主机时间同步(根据环境需要,可选项) 1687 | # [8] 清空回收站内容 and 询问你删除回收站功能吗?(开启回收站功能,当执行rm误删时,它可拯救你) 1688 | # 1689 | # [9] 一键解决常见问题 1690 | # + 解决普通用户定时任务无法定时执行的问题 1691 | # + 解决 ubuntu multipath add missing path 错误 1692 | # 1693 | # [10] 删除安全加固过程中产生的临时文件,为基线镜像做准备 1694 | # 1695 | # 以下脚本,仅供参考: 1696 | # disk_Lvsmanager 磁盘LVS逻辑卷添加与配置\033[32m 1697 | ===================================================================== 1698 | \033[31m注意: 1699 | 1. 回收站目录在用户家下面的/.trash目录,会不断堆积会导致空间不足哦!日志定时清理脚本记得不要用rm改用find或其他切分工具 1700 | 2. 用户终端执行的历史命令记录保存目录为/var/log/.history/${USER}.${LOGTIME}.history 1701 | 3. 修改内核后,请务必检查下各项指标设置是否正确 sysctl -p /etc/sysctl.d/99-sysctl.conf\033[0m" 1702 | 1703 | } 1704 | 1705 | run_main(){ 1706 | 1707 | log_info "run start..." 1708 | 1709 | # 1. 检查/etc/hosts是否加入了主机ip 1710 | Os_Check_Hosts 1711 | 1712 | # 2. 打印出选择项 1713 | cmd_info_print 1714 | 1715 | # 3. 输入数字,执行对应的选项操作 1716 | # 定义一个循环次数计数器 1717 | i_count=1 1718 | while [ $i_count -lt 10 ] 1719 | do 1720 | cmd_number="" 1721 | read -p "Please enter the number of the operation item or Press q to exit: " -t 90 cmd_number 1722 | if [[ $cmd_number = "Q" || $cmd_number = "q" ]]; then break; fi 1723 | case ${cmd_number} in 1724 | 0) 1725 | # Liunx 系统创建SWAP交换分区 1726 | Os_Swap 1727 | ;; 1728 | 1) 1729 | # 网络连通性检测,输入目标ip或域名 1730 | Ping_Status 1731 | ;; 1732 | 11) 1733 | # 配置全局DNS,当然你可以在某个网卡上设置dns 1734 | Os_SetDNS 1735 | ;; 1736 | 2) 1737 | # 设为国内源 1738 | Os_SetSoftSource_Aliyun 1739 | ;; 1740 | 21) 1741 | # 内核版本升级 1742 | Os_Update_Software 1743 | ;; 1744 | 22) 1745 | # 使用包管理器安装常用软件 1746 | Os_Install_Common_Software 1747 | ;; 1748 | 23) 1749 | ## 一键卸载或禁用多余的软件包 1750 | # 禁用烦人的apport错误报告 1751 | svc_disable_apport 1752 | # 非云的环境下,禁用或者卸载多余的cloud-init软件及其服务 1753 | svc_remove_cloudinit 1754 | # 在系统启动时禁用debug-shell服务 1755 | svc_disable_debugshell 1756 | ;; 1757 | 3) 1758 | ## 系统优化、安全加固等,一键设置 1759 | # 系统的最大文件打开数限制 1760 | Os_Optimize_ResourcesLimits 1761 | # 系统内核参数优化(含关闭ipv6) 1762 | Os_Optimize_Kernel 1763 | # 主机时区设置东8区 1764 | Os_TimedataZone 1765 | # 禁用ctrl+alt+del重启系统 1766 | sec_disable_ctrl_alt_del 1767 | # 设置文件删除回收站别名(防止误删文件) 1768 | sec_file_recycle_bin 1769 | # 防止不生效,单独再执行一下 1770 | source /etc/profile.d/alias.sh 1771 | # 用户密码复杂性策略设置 1772 | sec_userpass_policy 1773 | # 系统sshd服务安全策略设置(符合等保三级要求) 1774 | sec_sshd_policy 1775 | # 系统 GRUB 安全设置防止物理接触从grub菜单中修改密码 1776 | sec_grub_policy 1777 | # 设置或恢复文件or目录权限 1778 | Os_Security_FilePermissions 1779 | # 开启防火墙,然后重启主机 1780 | sec_firewall_policy 1781 | ;; 1782 | 31) 1783 | # 系统的最大文件打开数限制 1784 | Os_Optimize_ResourcesLimits 1785 | ;; 1786 | 32) 1787 | # 系统内核参数优化(含关闭ipv6) 1788 | Os_Optimize_Kernel 1789 | ;; 1790 | 33) 1791 | # 主机时区设置东8区 1792 | Os_TimedataZone 1793 | ;; 1794 | 34) 1795 | # 禁用ctrl+alt+del重启系统 1796 | sec_disable_ctrl_alt_del 1797 | ;; 1798 | 35) 1799 | # 设置文件删除回收站别名(防止误删文件) 1800 | sec_file_recycle_bin 1801 | # 防止不生效,单独再执行一下 1802 | source /etc/profile.d/alias.sh 1803 | ;; 1804 | 36) 1805 | # 用户密码复杂性策略设置 1806 | sec_userpass_policy 1807 | ;; 1808 | 37) 1809 | # 系统sshd服务安全策略设置(符合等保三级要求) 1810 | sec_sshd_policy 1811 | ;; 1812 | 38) 1813 | # 系统 GRUB 安全设置防止物理接触从grub菜单中修改密码 1814 | sec_grub_policy 1815 | ;; 1816 | 39) 1817 | # 开启防火墙,然后重启主机 1818 | sec_firewall_policy 1819 | ;; 1820 | 4) 1821 | # 登陆前和后的banner主机信息展示 1822 | ssh_login_banner 1823 | # 用户登陆安全策略设置(如设置登录超时时间)、系统用户ubuntu密码失效策略设置 1824 | sec_login_policy 1825 | # 用于锁定或者删除多余的系统账户 1826 | sec_usercheck 1827 | # 用户终端执行的历史命令记录安全策略设置 1828 | sec_historypolicy 1829 | ;; 1830 | 41) 1831 | # 登陆前和后的banner主机信息展示 1832 | ssh_login_banner 1833 | ;; 1834 | 42) 1835 | # 用户登陆安全策略设置(如设置登录超时时间)、系统用户ubuntu密码失效策略设置 1836 | sec_login_policy 1837 | ;; 1838 | 43) 1839 | # 用于锁定或者删除多余的系统账户 1840 | sec_usercheck 1841 | ;; 1842 | 44) 1843 | # 用户终端执行的历史命令记录安全策略设置 1844 | sec_historypolicy 1845 | ;; 1846 | 45) 1847 | # 切换用户日志记录和切换命令更改名称为SU(可选,一键设置不含此项) 1848 | sec_su_policy 1849 | ;; 1850 | 46) 1851 | # 禁止或允许root用户远程登陆(等保要求禁止) 1852 | sec_permit_root_remotelogin 1853 | ;; 1854 | 5) 1855 | # 更改ssh登陆端口(默认改为40107) 1856 | run_sec_change_sshport 1857 | ;; 1858 | 6) 1859 | # 创建一个拥有sudo权限的运维用户($VAR_USER_NAME,拥有管理权限,执行sodu命令时需要输入密码) 1860 | run_add_user 1861 | ;; 1862 | 7) 1863 | # 配置主机时间同步(使用Chrony,根据实际环境进行,可选项) 1864 | Os_HostTimeSync_Chrony 1865 | ;; 1866 | 8) 1867 | # 清空回收站,清理log日志 1868 | Trash_Clear 1869 | ;; 1870 | 9) 1871 | ## 一键解决常见问题 1872 | # 解决普通用户定时任务无法定时执行的问题 1873 | problem_usercrond 1874 | # 解决 ubuntu multipath add missing path 错误 1875 | problem_multipath 1876 | ;; 1877 | 10) 1878 | # 删除安全加固过程中产生的临时文件,为基线镜像做准备 1879 | system_clean 1880 | ;; 1881 | *) 1882 | # 打印出选择项 1883 | cmd_info_print 1884 | i_count=$((i_count+1)) 1885 | ;; 1886 | esac 1887 | 1888 | done 1889 | 1890 | log_info " It's over, Good night. Bye!" 1891 | 1892 | } 1893 | 1894 | run_main 1895 | -------------------------------------------------------------------------------- /linux_adduser.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | #用途:添加普通用户,日常运维使用普通用户 4 | # 5 | 6 | # 添加普通用户,定义变量 7 | user_name="uudocker" 8 | #单引号中的任何字符都只当作是普通字符 9 | user_passwd='zRM8B%Ka!5Fh%Out' 10 | group_name="docker" 11 | 12 | #变更所属用户的目录,多个目录空格隔开 13 | arr_dirs=(/usr/local/docker /data) 14 | 15 | function add_group(){ 16 | #create group if not exists 17 | egrep "^$group_name" /etc/group >& /dev/null 18 | if [ $? -ne 0 ] 19 | then 20 | groupadd $group_name 21 | fi 22 | } 23 | 24 | function add_user(){ 25 | 26 | #1.添加一个用户,并指定根目录 27 | useradd -d /home/$user_name -m $user_name -s /bin/bash 28 | 29 | #2。将用户添加到组(多个时以逗号隔开),添加时是追加的方式 30 | usermod -G $group_name $user_name 31 | 32 | #3.设置用户密码 33 | echo $user_passwd | passwd --stdin $user_name 34 | 35 | #4.给普通用户授权sudo 36 | chmod -v u+w /etc/sudoers 37 | sed -i '/^'"$user_name"'.*$/d' /etc/sudoers 38 | tmp_str="$user_name ALL=(ALL) ALL" 39 | sed -i "/^root.*$/a ${tmp_str}" /etc/sudoers 40 | chmod -v u-w /etc/sudoers 41 | 42 | #5.给目录赋予权限的可读可写 43 | for dstr in ${arr_dirs[*]} 44 | do 45 | if [ ! -d "$dstr" ]; then 46 | mkdir -p $dstr 47 | fi 48 | 49 | chown -R $user_name:docker $dstr 50 | chmod -R 755 $dstr 51 | 52 | done 53 | 54 | } 55 | 56 | function add_user_main(){ 57 | #create user if not exists 58 | egrep "^$user_name" /etc/passwd >& /dev/null 59 | if [ $? -ne 0 ] 60 | then 61 | add_user 62 | fi 63 | } 64 | 65 | read -r -p "你需要创建一个普通用户($user_name)吗?[Y/n] " input 66 | case $input in 67 | [yY][eE][sS]|[yY]) 68 | #echo -e "\033[32mYes, continue...\033[0m" 69 | add_group 70 | add_user_main 71 | echo "普通用户 $user_name:$group_name 创建完毕!" 72 | ;; 73 | [nN][oO]|[nN]) 74 | echo -e "\033[33mNo, continue...\033[0m" 75 | ;; 76 | *) 77 | echo -e "\033[31m you input isn't yes or no.\n\033[0m" 78 | ;; 79 | esac -------------------------------------------------------------------------------- /linux_change_sshport.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 用途:更改 linux 系统的ssh登陆端口 4 | # 使用 5 | # mkdir /tmp/shell 6 | # sh /tmp/shell/change_sshport.sh 7 | 8 | 9 | echo -e "\033[36m更改ssh默认端口,提高安全性!\033[0m" 10 | 11 | SSH_PORT=40107 12 | 13 | ## 公共方法-全局Log信息打印函数 14 | ## 参数: $@ 15 | log_err() { 16 | printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[31mERROR: $@ \033[0m\n" 17 | } 18 | log_info() { 19 | printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[32mINFO: $@ \033[0m\n" 20 | } 21 | log_warning() { 22 | printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[33mWARNING: $@ \033[0m\n" 23 | } 24 | 25 | 26 | # 验证否为数字 27 | function isValidNum() { 28 | 29 | local num=$1 30 | local ret=1 31 | 32 | if [ "$num" -gt 0 ] 2>/dev/null ;then 33 | echo "$num is number." 34 | ret=0 35 | else 36 | echo "$num not a number!" 37 | ret=1 38 | fi 39 | 40 | return $ret 41 | } 42 | 43 | # 输入ssh port 44 | function Input_SshPort() { 45 | while true; do 46 | read -p "建议使用端口从40101开始,请输入 ssh 端口号:" SSH_PORT 47 | isValidNum ${SSH_PORT} 48 | [ $? -eq 0 ] && break 49 | done 50 | 51 | } 52 | 53 | ## 名称: Os_Change_SShPort 54 | ## 用途: 更改ssh端口号,不输入参数则使用defaultport 55 | ## 参数: $1(端口号) 或 无 56 | function Change_SShPort() { 57 | 58 | log_info "[-] 更改ssh默认端口,提高安全性..." 59 | 60 | # 判断是否输入了参数 61 | if [ -n "$1" ];then 62 | # echo "第一个参数$1" 63 | SSHPORT=${1} 64 | fi 65 | 66 | # 1. ssh配置文件去除原来的ssh登陆端口 67 | arr_port=$(cat /etc/ssh/sshd_config | grep ^Port.* | awk '{print $2}' ) 68 | for port in ${arr_port[@]} 69 | do 70 | log_info "[-] 正在去除ssh端口:$port" 71 | firewall-cmd --zone=public --remove-port=${port}/tcp --permanent 72 | sleep 2 73 | 74 | done 75 | #这里注销掉所有以Port开头的。/d是删除所有以prot开头的行 76 | sed -i 's/^Port/#Port/g' /etc/ssh/sshd_config 77 | #sed -i '/^Port/d' /etc/ssh/sshd_config 78 | 79 | # 2. ssh配置文件加入新端口 80 | sed -i "/#Port 22/a\Port ${SSH_PORT}" /etc/ssh/sshd_config 81 | 82 | # 3. 添加sshd服务20211端口到SELinux,已禁用了SELinux,就不用添加了 83 | #semanage port -m -t ssh_port_t -p tcp 20211 84 | 85 | # 4. 防火墙端口 86 | firewall-cmd --permanent --add-port=${SSH_PORT}/tcp 87 | firewall-cmd --zone=public --remove-port=22/tcp --permanent 88 | firewall-cmd --reload 89 | 90 | systemctl restart sshd 91 | 92 | log_info "[-] 设置完毕,请使用ssh端口 ${SSH_PORT} 登陆 " 93 | 94 | } 95 | 96 | 97 | function run() { 98 | 99 | read -r -p "Do you agree to change the SSH port to 40107? If not, please enter new port? [Y/n] " input 100 | case $input in 101 | [yY][eE][sS]|[yY]) 102 | echo -e "\033[32mYes, continue...\033[0m" 103 | Change_SShPort 104 | ;; 105 | [nN][oO]|[nN]) 106 | Input_SshPort 107 | Change_SShPort ${SSH_PORT} 108 | ;; 109 | *) 110 | echo -e "\033[31merror! you input isn't yes or no.\n\033[0m" 111 | exit 1 112 | ;; 113 | esac 114 | 115 | } 116 | 117 | run 118 | -------------------------------------------------------------------------------- /某测评员等保测评指导书(参考)/MySQL-等保测评指导书.txt: -------------------------------------------------------------------------------- 1 | 1、身份鉴别 2 | 密码复杂度、账户唯一性 3 | 查看数据库所在安装目录下my.cnf/my.ini文件,其中是否不包含“skip-grant-tables”参数,不允许跳过数据库权限验证;(一般位于/etc/my.cnf,或通过mysql --help|grep 'my.cnf'查找)。 4 | 5 | root用户下,切换到mysql用户:su - mysql;mysql -u root -p,查看是否需要密码登陆。 6 | 7 | 登录mysql,执行select user,host from mysql.user; 8 | 查看数据库所有用户,核查是否有用户名和host均相同的用户(注:host和username是联合主键,同一用户可能有多个host,不算为身份标识不唯一。) 9 | 10 | 执行select user,password from mysql.user; 11 | 查看是否存在空口令账户;(注:MySQL5.7以上版本password字段修改为authentication_string。) 12 | 13 | Mysql5.6以下版本不能自定义密码复杂度和更换周期; 14 | 15 | Mysql5.6.6以上版本,使用命令 16 | #mysql> show variables like 'validate%'; 17 | 核查数据库是否配置密码复杂度策略,如: 18 | validate_password_length 8 19 | validate_password_mixed_case_count 1 20 | validate_password_number_count 1 21 | validate_password_policy MEDIUM 22 | validate_password_special_char_count 1 23 | 其中validate_password_policy不能配置为LOW,须为MEDIUM或STRONG。 24 | 25 | Mysql5.7.4以上版本,登录数据库,使用命令 26 | #mysql> show variables like 'default_password_lifetime'; 27 | 或查看数据库所在安装目录下my.cnf/my.ini文件,其中是否设置全局变量default_password_lifetime来限制密码过期策略。 28 | 29 | 30 | 登陆失败处理和超时 31 | Mysql数据库不能自定义登录失败处理策略,使用命令show plugins;或 32 | select * from information_schema.plugins where plugin_name like '%connection%'; 33 | 34 | 查看是否安装connect_control和connect_control_failed_login_attempts插件。如果已经安装相关插件,使用命令show variables like 'conn%control%',查看是否配置登录失败锁定策略。 35 | 注: 36 | connection_control_failed_connections_threshold:登录失败次数阈值。connection_control_min_connection_delay:登录失败后最短锁定毫秒数。connection_control_max_connection_delay:登录失败后最长锁定毫秒数。 37 | 38 | 39 | #mysql> show variables like '%timeout%'; 40 | 查看interactive_timeout(针对交互式连接)的值是否合理; 41 | 42 | 测试长时间不操作,数据库是否能自动断开连接。 43 | 44 | 45 | 远程管理 46 | Mysql数据库为安全考虑应禁用远程管理功能,以保证管理数据库的用户首先需要登录操作系统。使用命令 47 | select user, host from mysql.user where host!=’localhost’ 48 | 查看user表中是否不存在可远程管理的账户。核查操作系统配置的安全策略能否满足要求; 49 | 如果使用了远程管理功能,则使用数据库管理客户端连接数据库时,口令默认使用哈希算法加密传输。使用抓包工具测试是否能获取数据库明文口令信息。 50 | 注:MySQL数据库默认符合。 51 | 52 | 2、访问控制 53 | 权限分配 54 | select * from mysql.user;和select * from mysql.db; 55 | 查看数据库中用户的权限策略,是否存在不必要的权限设置; 56 | 57 | 登录mysql,执行show database like 'test'; 58 | 核查是否已删除测试数据库; 59 | 60 | select user, host from mysql.user where host!=’localhost’ 61 | 查看是否限制数据库管理员的远程登录权限。 62 | 63 | 64 | 65 | 重命名默认账户 66 | 登入mysql,执行select user from mysql.user 67 | 查看是否存在未更名的默认账户,如root用户;注:修改root账户名可能导致应用程序错误,故不强制要求重命名。 68 | 69 | Mysql5.7以上版本,使用命令select user,host,account_locked from mysql.user; 70 | 核查mysql.session和mysql.sys默认账户是否已锁定(默认锁定); 71 | 72 | 在数据库服务器使用命令grep "temporary password" /var/log/mysqld.log 73 | 查看数据库安装时的随机密码,并使用该密码尝试登录数据库,核查是否成功。 74 | 75 | 76 | 77 | 删除过期账户 78 | 进入mysql,执行select user from mysql.user 79 | 查看数据库所有用户,并访谈管理员说明每个用户的功能,核查是否存在多余或过期账户; 80 | 81 | 进入mysql,执行select user from mysql.user 82 | 查看数据库所有用户。访谈数据库管理员、安全员和审计员,核查不同用户是否采用不同账户登录系统。 83 | 84 | 85 | 最小权限、权限分离 86 | 进入mysql,执行select * from user; 87 | 查看用户权限列表,一般用户应当只有select、insert或update权限,只有管理员才能有所需的管理权限; 88 | 89 | MySQL数据库不具备安全标记功能,默认不符合; 90 | 91 | 92 | 3、安全审计 93 | 进入mysql,执行show variables like '%log%'; 94 | 查看是否开启了重要日志功能,如错误日志(log_error)、查询日志(general_log)、二进制日志(log_bin); 95 | 96 | 进入mysql,执行show variables like '%log% 97 | 根据general_log_file查找general_log查询日志位置,或登录数据库所在服务器,使用命令cat /etc/my.cnf,查找log_bin二进制日志位置。查看日志内容,是否对所有用户的sql命令均进行记录。 98 | (如开启日志则默认符合); 99 | 100 | 进入mysql,执行show variables like '%log% 101 | 查看重要日志保存位置,查看各日志文件,核查是否对数据库重要的用户行为和重要安全事件进行审计。 102 | 注:general_log可记录所有用户的sql查询语句,但影响效率;log_bin记录所有数据修改;log_error记录数据库错误事件。 103 | 104 | 105 | 4、入侵防范 106 | 登录mysql,执行select user,host from mysql.user; 107 | 查看数据库是否限制账户的登录地址范围,如限制root的host为localhost,仅可本地登录等。 108 | 预期结果:执行步骤1),已对用户的登录地址范围进行了限制,host列不存在‘%’; 109 | 110 | select version (); 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /某测评员等保测评指导书(参考)/linux-centos等保测评指导书.txt: -------------------------------------------------------------------------------- 1 | 查看操作系统版本 2 | lsb_release -a 3 | 4 | 1、查看唯一性,账户,空密码 5 | more /etc/passwd 6 | more /etc/shadow 7 | 8 | !!或*表示账户不能登录,新建用户如果不设密码,也会显示!!,表示不能登录 9 | 10 | 2、查看密码复杂度 11 | more /etc/login.defs 12 | PASS_MAX_DAYS 99999 密码有效期 13 | PASS_MIN_DAYS 0 密码最短修改时间 14 | PASS_MIN_LEN 5 密码最小长度 15 | PASS_WARN_AGE 7 密码过期提前7天提示修改 16 | 17 | more /etc/pam.d/system-auth 18 | password requistite pam_cracklib.so 19 | retry=3(密码尝试3次) difok=3(最少不同字符)minlen=10(最小长度)ucredit=1(最少大写字母)lcredit=3(最少小写字母)dcredit=3(最少数字) 20 | redhat5以后使用pam_tally2.so控制密码认证失败的次数上限,可实现登陆次数、超时时间、解锁时间等。 21 | 22 | more /etc/profile 23 | 查看TMOUT超时设置 24 | 25 | 3、远程管理 26 | service --status-all|grep sshd,查看sshd是否开启 27 | netstat -an|grep 22 查看端口 28 | service --status-all|grep running,查看是否开启telnet 29 | 30 | 31 | 4、访问控制-应对用户分配权限----配置文件不能大于644,可执行文件不能大于755 32 | 33 | 34 | 5、重命名或删除默认用户,root禁止远程登陆。 35 | more /etc/ssh/sshd_config,查找#PermitRootLogin yes;禁止root远程应该为PermitRootLogin no 36 | 37 | 6、最小权限 38 | more /etc/sudo.conf,查看root级权限授予了哪些用户 39 | 40 | 7、敏感标记 41 | more /etc/selinux/config 42 | 43 | SELINUXTYPE=targeted 默认策略,对大部分网络服务进程进行管制 44 | SELINUXTYPE=minimum 以targeted为基础,仅对选定的网络服务进程进行管制(一般不用) 45 | SELINUXTYPE=mls 多级安全保护对所有进程进行管制。 46 | 47 | SELINUX=permissive 宽容模式 只记录 48 | SELINUX=enforceing 强致模式 阻止并记录(这项符合测评要求,其他项不符合) 49 | SELINUX=disabled 关闭 50 | 51 | 8、安全审计 52 | ps -ef |grep auditd,查看服务进程 53 | service auditd status 查看服务状态 54 | service rsyslog status 查看服务状态 55 | more /etc/audit/auditd.conf 查看审计配置 56 | more /etc/audit/audit.rules 查看审计规则,监控文件系统行为(4个动作,r、w、x、a,读、写、执行、修改属性) 57 | 例如:-w /etc/passwd -p wa,监控passwd文件的写入和修改行为(-w,路径;-p,需要监控的权限是wa,写和修改) 58 | 59 | -D (刪除舊記錄,預設-D) 60 | -b 8192 (buffer大小,預設256,改為8192) 61 | -f 1 (失敗控制旗標,可設為 0 (silent), 1 (印出錯誤,預設), and 2 (panic, 把系統關閉—非正常關閉,所以會有資料遺失的風險). 62 | 63 | tail -20 /var/log/audit/audit.log 查看后20行日志 64 | 65 | 9、入侵检测 66 | yum list installed 查看安装了哪些程序包 67 | 68 | service --status-all|grep running,查看是否关闭危险网络服务 69 | netstat -ntlp 查看开放端口 70 | 71 | cat /etc/host.allow 查看是否现在远程登陆地址范围 72 | cat /etc/host.deny 73 | 是否从防火墙上做了限制 74 | 75 | rpm -qa |grep patch 查看补丁安装情况 76 | 77 | more /var/log/secure |grep refused 查看入侵拒绝情况。 78 | --------------------------------------------------------------------------------