在Ansible中編寫劇本實現(xiàn)批量服務(wù)器安全加固
在上一篇<<初步利用Ansible實現(xiàn)批量服務(wù)器自動化管理>>文章中, 我初步實現(xiàn)了通過編寫清單和劇本來實現(xiàn)多臺服務(wù)器的自動化管理,在本章節(jié)中, 我將利用Ansible的劇本來實現(xiàn)更實用、更復(fù)雜一點的功能, 主要功能包括三個:
- 同時在三臺服務(wù)器中增加IP訪問控制,只允許192.168.201.202的IP登錄,其它IP禁止其通過SSH登錄。
- 修改SSH服務(wù)的默認(rèn)22端口,修改為2222。
- 啟動防火墻,只允許2222端口訪問, 不允許其它端口訪問。
1.編寫劇本
如果只講原理,沒有實踐, 學(xué)習(xí)起來會比較枯燥, 所以我會在編寫劇本的過程中邊實踐邊講解劇本的語法。
在上篇文章中, 我們已經(jīng)知道劇本是一個YAML格式文件, 在開頭,我們要加載所有的遠(yuǎn)程管理hosts,語法如下:
- hosts: all
還記得在上一章編寫的清單文件inventory.yaml嗎,看看里面的內(nèi)容:
hosts: all默認(rèn)會加載這里的所有IP地址, 緊隨其后的命令是:
become: yes
該命令在Ansible中表示提權(quán)執(zhí)行。
默認(rèn)情況下,Ansible是以普通用戶身份通過SSH連接到遠(yuǎn)程主機的。但有些任務(wù)需要 root 或 sudo 權(quán)限,比如服務(wù)的重啟,文件權(quán)限的修改等。這時就需要使用become模塊提權(quán), 加上become:yes表示這個劇本中的所有任務(wù)都需要提權(quán)執(zhí)行。Ansible會在執(zhí)行任務(wù)時自動切換到root身份或目標(biāo)用戶身份,然后執(zhí)行指定的任務(wù)。
become模塊非常強大,可以精細(xì)控制在劇本中的提權(quán)行為,包括:
- 以哪個身份提權(quán)(默認(rèn)root,可以指定其他用戶)- 提權(quán)使用的方法(sudo、su等)- 提權(quán)的密碼- 僅在某些任務(wù)中提權(quán)
緊接著就是編寫我們的任務(wù)了, 為了方便介紹, 我先給出一個完整的服務(wù)劇本,如圖:
- hosts: all
become: yes
tasks:
- name: 修改SSH端口
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^Port'
line: 'Port 2222'
- name: 默認(rèn)開啟防火墻
ufw:
state: enabled
- name: 在防火墻中開啟2222端口
ufw:
rule: allow
port: '2222'
- name: 防火墻拒絕其它端口連接
ufw:
rule: deny
direction: in
delete: yes
- name: 允許指定的IP訪問
ufw:
rule: allow
src: 192.168.201.202
- name: 拒絕所有其它IP訪問
ufw:
rule: deny
src: 0.0.0.0/0
- name: 重啟ufw防火墻
service:
name: ufw
state: restarted
- name: 重啟SSH服務(wù)
service:
name: sshd
state: restarted
可以看出, 任務(wù)tasks標(biāo)簽下面有8個子項, 每個子項都有一個name, 這個name表示每個子任務(wù)的名字, 方便我們區(qū)分子任務(wù)。
子任務(wù)1: 修改SSH端口
該任務(wù)使用了lineinfile模塊, 目的是在路徑/etc/ssh/sshd_config文件中按行搜索, 通過正則regexp匹配Port, 然后將其修改為2222端口。
我們可以打開/etc/ssh/sshd_config文件看一下, 查找到該項:
在ubuntu系統(tǒng)中, Port一般在ssd_config文件的最后一行。
子任務(wù)2:默認(rèn)開啟防火墻
對于ubuntu系統(tǒng)來說,防火墻使用的是ufw, 這里將狀態(tài)state始終置為:enabled, 因為大部分剛裝完的系統(tǒng)默認(rèn)沒有開啟ufw,因此這里需要提前設(shè)置狀態(tài), 否則會導(dǎo)致后面操作ufw不成功。
子任務(wù)3: 在防火墻中開啟2222端口
在該任務(wù)中,我們將之前修改的SSH服務(wù)的2222端口添加到防火墻中, 允許外界通過2222端口訪問本機。
子任務(wù)4:防火墻拒絕其它端口連接
在該任務(wù)中, 我們主要設(shè)置了拒絕規(guī)則, 在防火墻中,除了2222端口之外的其它所有端口全部刪除屏蔽掉。
子任務(wù)5:允許指定的IP訪問
與上面的端口相同,這里設(shè)置只允許某一個IP訪問本機,這里是只允許192.168.201.202服務(wù)器訪問。
子任務(wù)6:拒絕所有其它IP訪問
同上面端口的拒絕規(guī)則, 拒絕除192.168.201.202的其它IP地址訪問。
子任務(wù)7:重啟ufw防火墻
這里主要使用restarted重啟ufo防火墻,注意,這里不能用reload, 可能會導(dǎo)致防火墻重啟失敗, 用restart比較穩(wěn)妥。
子任務(wù)8:重啟SSH服務(wù)
通過設(shè)置restarted狀態(tài)重啟SSH服務(wù)
2.多任務(wù)同步執(zhí)行
編寫完劇本內(nèi)容之后, 輸入以下命令執(zhí)行即可:
# ansible-playbook -i inventory.yaml playbook.yaml
如果不出意外, 會看到以下執(zhí)行結(jié)果:
如果在執(zhí)行過程中出現(xiàn)錯誤, 會看到很醒目的提示,并給出執(zhí)行狀態(tài), 如圖:
3.結(jié)果驗證
首先我們看一下端口修改情況, 發(fā)現(xiàn)已經(jīng)全部將SSH端口修改為2222端口,并可以全部以2222端口登錄, 如圖:
接著我們看一下IP限制情況, 上面登錄的全部是在192.168.201.202機器上登錄,而在我個人電腦上登錄卻失敗,如圖:
我們登錄到三臺機器上看一下防火墻規(guī)則, 已經(jīng)按照劇本要求添加了對應(yīng)規(guī)則,如圖: