Ansible 持續整合Anolis、Ubuntu基線配置
需求
《Ansible實現等保安全合規基線,運維盡力了!》一文我們主要對Centos6 和 Centos7進行了初始化和安全基線的適配,但是隨著Centos停服,運維要面臨多樣化的替代系統。
因此我們結合《CentOS停服替代後,哪些操作差異你知道嗎?》一文對Anolis8.6 和 Ubuntu22.04 作業系統的差異化操作,透過Ansible Playbook
再次納管了Anolis8.6 和 Ubuntu22.04兩個作業系統的初始化配置和安全基線,實現自動化配置的可持續性。
安全控制點
既然是可持續性的接入,因此我們的配置仍從以下幾方面展開:
內部標準初始化配置 身份鑑別 入侵防範 安全審計
其中,“內部標準初始化配置”可根據企業內部已有的標準規範配置進行補充擴充,例如:
標準目錄 標準應用使用者 統一的安裝源 統一的limit引數 等等
而“身份鑑別、入侵方案、安全審計”我們仍按等保要求的安全控制點適配不同的作業系統。
差異化分析
《CentOS停服替代後,哪些操作差異你知道嗎?》一文分析了與Cento7 相比,Anolis8.6 和 Ubuntu22.04 一些差異化操作,透過目錄可以看出主要在以下幾個方面:
DNS 時間同步 安全基線 核心安全模組 防火牆
當然隨著企業內部不同的安全需求,差異化的操作可能更多,但我們只需按部就班的進行整合即可。
Ansible持續整合
在自動化建設中,Ansible作為配置管理工具承擔著作業系統級、基礎元件安裝級、叢集部署級等自動化部署的角色。其中基線配置作為作業系統級的重要組成部分,我們在相容Centos6、Centos7的基礎上,再次適配了Anolis8.6和Ubuntu22.04。
本次介紹我們主要以差異較大的內部標準初始化配置、身份鑑別為主進行介紹。
1.前置解析
本次配置由ansible gather_facts
獲取作業系統版本,透過ansible_distribution_major_version
變數來做進一步區分,如:
Centos7,ansible_distribution_major_version版本號為7 Anolis8.6,ansible_distribution_major_version版本號為8 Ubuntu22.04,ansible_distribution_major_version版本號為22
另外,我們透過ansible tag
對不同模組的配置進行分類定義,以便滿足後續的單獨變更需求。
cat ansible-playbook/roles/os_init/task/main.yml
- include: dns.yml #環境變數
- include: profile.yml #環境變數
- include: selinux.yml #selinux
- include: ntp.yml #時間同步
- include: rsyslog.yml #日誌同步
- include: audit.yml #安全審計
- include: sshd.yml #ssh最佳化
- include: safe.yml #Centos7 基礎安全合規基線
- include: safe_anolis.yml #anolis8.6 基礎安全合規基線
- include: safe_ubuntu.yml #Ubuntu22.04基礎安全合規基線
注意:請更具實際配置調整task的順序,例如:安全基線在生效後,後續建立的新使用者都將滿足新基線的過期要求,但是在安全基線配置前的仍保留永久有效的配置。「如果不注意的話,安全加固將會導致非常嚴重的生產事故」。
2.內部標準初始化配置
內部標準的初始化配置,我們在此特選擇了幾個作業系統間差異較大的dns、ntp為主進行介紹。
dns
關於dns配置,主要是Ubuntu22.04 操作有差異,為保證永久生效,需要藉助resovconf
。
- name: config dns
lineinfile:
path: /etc/resolv.conf
line: "{{ item }}"
with_items:
- "nameserver 192.168.1.1"
when: ansible_distribution_major_version != "22"
tags: dns
- name: test resovconf exist
shell: which resovconf
register: result
ignore_errors: yes
when: ansible_distribution_major_version == "22"
tags: dns
- name: config dns temp
lineinfile:
path: /etc/resolv.conf
line: "{{ item }}"
with_items:
- "nameserver 192.168.1.1"
when: ansible_distribution_major_version == "22" and result.rc != 0
tags: dns
- name: apt install resolvconf
apt:
name: resolvconf
update_cache: yes
state: present
when: ansible_distribution_major_version == "22" and result.rc != 0
tags: dns
- name: config dns forever
lineinfile:
path: /etc/resolvconf/resolv.conf.d/head
line: "nameserver 192.168.1.1"
when: ansible_distribution_major_version == "22"
notify:
- resolvconf -u
tags: dns
ntp
關於ntp配置,主要是
Anolis8 捨棄了ntp,預設使用chrony進行時間同步; Ubuntu22.04 預設使用timesyncd 進行時間同步,但是透過安裝ntp,也支援ntp進行同步;
- name: set ntp
cron:
name: "time sync for ntp"
job: "/usr/sbin/ntpdate 192.168.1.1 && /sbin/hwclock -w"
minute: "30"
hour: "*"
state: present
when: ansible_distribution_major_version == "7"
tags: ntp
- name: set ntp
lineinfile:
path: "/etc/chrony.conf"
regexp: "^pool ntp.aliyun.com iburst"
line: "server 192.168.1.1 iburst"
when: ansible_distribution_major_version == "8"
notify:
- restart chronyd
tags: ntp
- name: set ntp
lineinfile:
path: "/etc/systemd/timesyncd.conf"
line: "NTP=192.168.1.1"
when: ansible_distribution_major_version == "22"
notify:
- restart systemd-timesyncd
tags: ntp
3.身份鑑別
❝1.應對登入的使用者進行身份標識和鑑別,身份標識具有唯一性,應實現身份鑑別資訊防竊取和防重用。靜態口令應在8位以上,由字母、數字、符號等混合組成並每半年更換口令,不允許新設定的口令與前次舊口令相同。應用系統使用者口令應在滿足口令複雜度要求的基礎上定期更換。 2.應具有登入失敗處理功能,應配置並啟用結束會話、限制登入間隔、限制非法登入次數和當登入連線超時自動退出等相關措施。 ❞
針對“規則1”標準具體限制如下:
密碼過期時間(90天過期、長度最小8位、禁止使用重複密碼) 密碼最小長度8位,複雜度包含大小寫字母、數字、特殊字元,適配Centos6、Centos7、Anolis8.6、Ubuntu22.04 密碼登入嘗試3次 禁止舊密碼
針對“規則2”標準具體限制如下:
防暴力破解 登入失敗鎖定(3次輸入錯誤,鎖定60秒) 終端1800秒結束會話 ssh每次登入時間不大於一分鐘 ssh身份驗證嘗試次數不大於4次
Anolis8.6
總體上Anolis8.6配置和Centos7 差不多,但是防暴力破解方面,faillock
取代了tally
。
vim safe_anolis.yml
- name: Anolis8 ban control-alt-delete
file:
path: /usr/lib/systemd/system/ctrl-alt-del.target
state: absent
when: ansible_distribution_major_version == "8"
tags: safe_anolis
# 設定密碼過期時間
- name: Anolis8 set password expire
lineinfile:
path: /etc/login.defs
regexp: "{{ item.regexp_string }}"
line: "{{ item.rule }}"
with_items:
- { regexp_string: "^PASS_MAX_DAYS", rule: "PASS_MAX_DAYS 90"}
- { regexp_string: "^PASS_MIN_DAYS", rule: "PASS_MIN_DAYS 0"}
- { regexp_string: "^PASS_MIN_LEN", rule: "PASS_MIN_LEN 8"}
- { regexp_string: "^PASS_WARN_AGE", rule: "PASS_WARN_AGE 10"}
when: ansible_distribution_major_version == "8"
tags: safe_anolis
# anolis8設定密碼複雜度、長度
- name: 1.Anolis8 set password quality
lineinfile:
path: /etc/security/pwquality.conf
regexp: "{{ item.regexp_string }}"
line: "{{ item.rule }}"
with_items:
- { regexp_string: "minlen", rule: "minlen = 8"}
- { regexp_string: "dcredit", rule: "dcredit = -1"}
- { regexp_string: "lcredit", rule: "lcredit = -1"}
- { regexp_string: "ocredit", rule: "ocredit = -1"}
- { regexp_string: "ucredit", rule: "ucredit = -1"}
when: ansible_distribution_major_version == "8"
tags: safe_anolis
# 禁止重複使用舊密碼
- name: Anolis8 set password quality
lineinfile:
path: "{{ item }}"
regexp: "^password sufficient pam_unix.so"
line: "password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5"
with_items:
- /etc/pam.d/password-auth
- /etc/pam.d/system-auth
when: ansible_distribution_major_version == "8"
tags: safe_anolis
# 防暴力破解,共3步
- name: 1.Anolis8 prevent brute force
lineinfile:
path: "{{ item }}"
insertafter: "auth required pam_env.so"
line: "auth required pam_faillock.so preauth audit silent deny=3 unlock_time=60"
with_items:
- /etc/pam.d/password-auth
- /etc/pam.d/system-auth
when: ansible_distribution_major_version == "8"
tags: safe_anolis
- name: 2.Anolis8 prevent brute force
lineinfile:
path: "{{ item }}"
insertafter: "auth sufficient pam_unix.so try_first_pass nullok "
line: "auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=60"
with_items:
- /etc/pam.d/password-auth
- /etc/pam.d/system-auth
when: ansible_distribution_major_version == "8"
tags: safe_anolis
- name: 3.Anolis8 prevent brute force
lineinfile:
path: "{{ item }}"
insertafter: "account required pam_unix.so"
line: "account required pam_faillock.so"
with_items:
- /etc/pam.d/password-auth
- /etc/pam.d/system-auth
when: ansible_distribution_major_version == "8"
tags: safe_anolis
Ubuntu22.04
Ubuntu22.04 與 Centos 差異較大的地方為:
預設使用 apparmor
而非selinux
進行核心安全限制;pam 模組使用 common-auth
和common-account
進行限制;
- name: Ubuntu22.04 ban control-alt-delete
file:
path: /usr/lib/systemd/system/ctrl-alt-del.target
state: absent
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
- name: os close service
service:
name: "{{ item }}"
state: stopped
enabled: no
with_items:
- "apparmor"
ignore_errors: yes
tags: safe_ubuntu1
# 設定密碼過期時間
- name: Ubuntu22.04 set password expire
lineinfile:
path: /etc/login.defs
regexp: "{{ item.regexp_string }}"
line: "{{ item.rule }}"
with_items:
- { regexp_string: "^PASS_MAX_DAYS", rule: "PASS_MAX_DAYS 90"}
- { regexp_string: "^PASS_MIN_DAYS", rule: "PASS_MIN_DAYS 0"}
- { regexp_string: "^PASS_MIN_LEN", rule: "PASS_MIN_LEN 8"}
- { regexp_string: "^PASS_WARN_AGE", rule: "PASS_WARN_AGE 10"}
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
# Ubuntu22.04設定密碼複雜度、長度
- name: 1.Ubuntu22.04 set password quality
lineinfile:
path: /etc/security/pwquality.conf
regexp: "{{ item.regexp_string }}"
line: "{{ item.rule }}"
with_items:
- { regexp_string: "minlen", rule: "minlen = 8"}
- { regexp_string: "dcredit", rule: "dcredit = -1"}
- { regexp_string: "lcredit", rule: "lcredit = -1"}
- { regexp_string: "ocredit", rule: "ocredit = -1"}
- { regexp_string: "ucredit", rule: "ucredit = -1"}
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
# 設定密碼嘗試3次
- name: 2.Ubuntu22.04 set password quality
lineinfile:
path: "{{ item }}"
regexp: "^password requisite pam_pwquality.so"
line: "password requisite pam_pwquality.so try_first_pass retry=3"
with_items:
- /etc/pam.d/common-password
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
# 禁止重複使用舊密碼
- name: Ubuntu22.04 set password quality
lineinfile:
path: "{{ item }}"
regexp: "^password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt"
line: "password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt remember=5"
with_items:
- /etc/pam.d/common-password
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
# 防暴力破解,共3步
# 使用者帳戶鎖定時連續身份驗證失敗必須達到的間隔長度預設為 900 秒
# 使用者賬戶鎖定時間為 600 秒, root使用者不受管控
- name: 1.Ubuntu22.04 modify faillock
lineinfile:
path: /etc/security/faillock.conf
regexp: "{{ item.regexp_string }}"
line: "{{ item.rule }}"
with_items:
- { regexp_string: "# audit", rule: "audit"}
- { regexp_string: "# deny = 3", rule: "deny = 3"}
- { regexp_string: "# silent", rule: "silent"}
- { regexp_string: "# unlock_time = 600", rule: "unlock_time = 600"}
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
- name: 2.Ubuntu22.04 common-auth authfail/authsucc
blockinfile:
path: "/etc/pam.d/common-auth"
block: |
auth [default=die] pam_faillock.so authfail
auth sufficient pam_faillock.so authsucc
insertbefore: "pam_deny.so"
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
- name: 3.Ubuntu22.04 common-auth preauth
lineinfile:
path: "/etc/pam.d/common-auth"
line: "auth required pam_faillock.so preauth"
insertbefore: "pam_unix.so nullok"
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
- name: 3.Ubuntu22.04 common-account preauth
lineinfile:
path: "/etc/pam.d/common-account"
line: "account required pam_faillock.so"
when: ansible_distribution_major_version == "22"
tags: safe_ubuntu
總結
為保證我們的合規基線的可持續化配置,因此我們一直在結合Iac+GitOps
的理念,藉助Ansible Playbook
實踐,以幫助我們更好的管理 IT 基礎架構需求,同時提高一致性並減少錯誤和手動配置。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027825/viewspace-2944739/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jenkins持續整合配置Jenkins
- 持續整合配置之Nuget
- 使用流水線外掛實現持續整合、持續部署
- 持續整合、持續交付與持續部署
- 持續整合、持續部署、持續交付、持續釋出
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 在Ubuntu上安裝Drone持續整合環境Ubuntu
- 持續整合工具之Jenkins基礎使用Jenkins
- 持續整合 2.0
- Jenkins持續整合Jenkins
- 持續整合(二)
- 你真的懂持續整合、持續交付、持續部署嗎?!
- 淺談持續整合(CI)、持續交付(CD)、持續部署(CD)
- 對持續整合、 持續交付、持續部署和持續釋出的介紹
- 持續整合、持續交付和持續部署有什麼區別?0基礎學習linux技能Linux
- 使用 Jenkins 配置 iOS 持續整合踩坑實錄JenkinsiOS
- 前端專案基於GitLab-CI的持續整合/持續部署(CI/CD)前端Gitlab
- 3分鐘瞭解清楚持續整合、持續交付、持續部署
- CircleCI 與持續整合
- Linux下配置Jenkins+gitlab持續整合構建流程LinuxJenkinsGitlab
- Jenkins與gitlab持續整合配置webhook報500錯誤JenkinsGitlabWebHook
- HTTP非持續連線和持續連線HTTP
- 什麼是持續整合?
- 持續整合 Jenkins 簡介Jenkins
- jenkins+docker 持續整合JenkinsDocker
- AspNetCore&Coding持續整合NetCore
- 持續整合Jenkins+GitlabJenkinsGitlab
- Jenkins 持續整合使用教程Jenkins
- Taro 小程式持續整合
- 如何將 InfoSec、Compliance 整合到持續交付流水線中
- 淺談持續整合的理解以及實現持續整合,需要做什麼?
- .net持續整合sonarqube篇之sonarqube安裝與基本配置
- docker版jenkins持續整合部署及連線gitee碼雲DockerJenkinsGitee
- Azure DevOps(一)基於 Net6.0 的 WPF 程式如何進行持續整合、持續編譯dev編譯
- GitLab CI持續整合-GitLab RunnerGitlab
- 小程式的持續整合方案
- CI 持續整合 - 阿里云云效阿里
- iOS持續整合(一)——fastlane 使用iOSAST