Linux系统的简单安全加固

2025-01-13 10:48:03 176

Linux系统的简单安全加固

欢迎来到蓝队云技术小课堂,每天分享一个技术小知识。

 

适用于 CentOS 7

---

- name: secure linux

  hosts: all

  ignore_errors: true

  vars:

    pass_max_days: 90  # 密码过期时间

    # 密码复杂度相关

    minlen: 8         # 最少位数

    minnum: 1         # 数字出现的最少次数,配置为0表示不校验是否包含数字

    minupper: 1       # 大写字母出现的最少次数,配置为0表示不校验是否包含大写字母

    minlower: 1       # 小写字母出现的最少次数,配置为0表示不校验是否包含小写字母

    minspecial: 1     # 特殊字符出现的最少次数,配置为0表示不校验是否包含特殊字符

    # 用户连续登录几次失败就锁定用户

    user_deny: 3

    # 用户锁定时长,单位秒

    user_lock_time: 300

    # 会话超时,多长时间没有操作退出用户,单位秒

    tmout: 900

    # 历史命令保留条数

    his_size: 10000

    # 服务相关

    stop_and_disable_services: ["telnet", "bluetooth"] # 要禁用的服务

    start_and_enable_services: ["rsyslog", "auditd"]   # 要启动的服务

    # 内核参数修改

    kernel_params:

    - { key: 'net.ipv4.tcp_max_syn_backlog', value: '1024' }

 

  tasks:

  - name: 配置密码周期策略

    command: sed -r -i 's#(PASS_MAX_DAYS)\\\\s+([0-9]+)#\\\\1 {{ pass_max_days }}#' /etc/login.defs

 

  - name: 配置密码复杂度

    command: sed -r -i 's#(password\\\\s+requisite\\\\s+)(.*)#\\\\1pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen={{ minlen }} dcredit=-{{ minnum }} ucredit=-{{ minupper }} lcredit=-{{ minlower }} ocredit=-{{ minspecial }}#' /etc/pam.d/system-auth

 

  - name: 配置登录失败策略

    command: sed -i '1a\\\\auth required pam_tally2.so onerr=fail deny={{ user_deny }} unlock_time={{ user_lock_time }} even_deny_root root_unlock_time={{ user_lock_time }}' /etc/pam.d/sshd

 

  - name: 停止服务

    service:

      name: "{{ item }}"

      state: stopped

    loop: "{{ stop_and_disable_services }}"

    register: stop_service

 

  - name: 禁用服务

    service:

      name: "{{ item }}"

      enabled: no

    loop: "{{ stop_and_disable_services }}"

    when: stop_service is succeeded

 

  - name: 启动服务

    service:

      name: "{{ item }}"

      state: started

    loop: "{{ start_and_enable_services }}"

    register: start_service

 

  - name: 配置开机自启动

    service:

      name: "{{ item }}"

      enabled: yes

    loop: "{{ start_and_enable_services }}"

    when: start_service is succeeded

 

  - name: 延长日志保存时间

    shell: sed -i 's/week/month/g' /etc/logrotate.conf && sed -i 's/rotate 4/rotate 6/' /etc/logrotate.conf && sed -i 's/rotate 1/rotate 6/' /etc/logrotate.conf

 

  - name: 添加会话超时锁定

    command: sed -i '$a\\\\export TMOUT={{ tmout }}' /etc/profile

 

  - name: 修改内核参数

    command:

      cmd: "sysctl -w {{ item.key }}={{ item.value }}"

    loop: "{{ kernel_params }}"

 

  - name: 修改历史命令保存条数

    command: sed -i 's/^HISTSIZE=1000/HISTSIZE={{ his_size }}/g' /etc/profile

 

  - name: 修改历史命令显示内容

    shell:

      cmd: |

        cat << EOF >> /etc/profile

        USER_IP=\\\\$(who -m 2>/dev/null | awk '{print \\\\$NF}' |sed -e 's/[()]//g')

        if [ "\\\\$USER_IP" = "" ];then

          USER_IP=\\\\$(hostname)

        fi

        export HISTTIMEFORMAT="%F %T \\\\$USER_IP \\\\$(whoami) "

        shopt -s histappend

        export PROMPT_COMMAND="history -a"

        EOF

 

  - name: 重载/etc/profile

    shell: . /etc/profile && echo ''

 

密码复杂度参数详解

密码复杂度配置通过修改 /etc/pam.d/system-auth 来实现,主要关注这一行

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=

之前使用 pam_cracklib.so 模块,后来改成了 pam_pwquality.so ,后者是完全兼容前者的也可通过修改 /etc/security/pwquality.conf 文件来修改密码复杂度

retry=N: 定义修改密码时,在满足需求之前可以重试的次数

authtok_type: 默认设置密码时的提示信息是:New password:,如果设置authtok_type=FOO,则提示信息是:New FOO password

minlen=N: 新密码的最小长度

minclass=N: 四种类型的字符串中至少要包含几种(数字、大写字母、小写字母、特殊符号)

dcredit=N: 当N>0时表示新密码中数字出现的最多次数;当N<0时表示新密码中数字出现最少次数

ucredit=N: 当N>0时表示新密码中大写字母出现的最多次数;当N<0时表示新密码中大写字母出现最少次数

lcredit=N: 当N>0时表示新密码中小写字母出现的最多次数;当N<0时表示新密码中小写字母出现最少次数

ocredit=N: 当N>0时表示新密码中特殊字符出现的最多次数;当N<0时表示新密码中特殊字符出现最少次数

maxrepeat=N: 拒绝包含多于N个相同连续字符的密码,比如("aaaaaa")这种

maxsequence=N: 拒绝包含长于N的单调字符序列的密码,比如("12345")这种。(建议使用maxclassrepeat代替)

maxclassrepeat=N: 新密码中允许的最大连续相同类型的字符,限制比如("123456")这种

enforce_for_root: 如果用户更改密码是root,则模块将在失败检查时返回错误。默认情况下,此选项处于关闭状态,只打印有关失败检查的消息,但root仍可以更改密码。不要求root用户输入旧密码,因此不会执行比较旧密码和新密码的检查

gecoscheck: 是否检查密码中包含要修改用户的用户名,比如用户名是poorops,则密码中不能包含poorops

我测试复杂度配置大于0无效,即配置了dcredit=3,但是密码中包含大于3个的数字也是可以的

登录失败策略参数详解

even_deny_root: 表示也限制root用户

deny: 表示设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户

unlock_time: 表示设定普通用户锁定后,多少时间后解锁,单位是秒

root_unlock_time: 表示设定root用户锁定后,多少时间后解锁,单位是秒

命令历史显示效果

  997  2025-01-13 18:01:52 192.168.71.190 root history | tail

  998  2025-01-13 18:01:52 192.168.71.190 root history

  999  2025-01-13 18:01:52 192.168.71.190 root cat /etc/profile

 1000  2025-01-13 18:01:52 192.168.71.190 root exit

 1001  2025-01-13 18:01:05 192.168.71.190 root history | tail

 1002  2025-01-13 18:01:37 192.168.71.190 root vim /etc/profile

 1003  2025-01-13 18:01:47 192.168.71.190 root source /etc/profile

 1004  2025-01-13 18:01:50 192.168.71.190 root exit

 1005  2025-01-13 18:01:57 192.168.71.190 root history | tail

 

蓝队云官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,蓝队云期待与你一起探索。

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: