안녕하세요, 오늘 내용은 앤서블을 활용하여 보안 설정을 하는 내용을 다룹니다.
사전 준비
1) 유저 생성
먼저 유저를 생성합니다.
아래와 같이 디렉터리를 생성하고, cfg 파일과 inventory 파일을 작성해 줍니다.
#
mkdir ~/my-ansible/chapter_09.1
cd ~/my-ansible/chapter_09.1
# ansible.cfg, inventory 파일 작성
cat <<EOT > ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT
cat <<EOT> inventory
tnode1
tnode2
tnode3
EOT
2) 접속 확인
#
sudo su -
#
for i in {1..3}; do ssh tnode$i hostname; done
#
exit
whoami
~/my-ansible/chapter_09.1/vars/users.yml
3) yml 파일 생성
mkdir vars
cat <<EOT > vars/users.yml
user_info:
- userid: "ansible"
userpw: "ansiblePw1"
- userid: "stack"
userpw: "stackPw1"
EOT
4) 플레이북 생성
~/my-ansible/chapter_09.1/create_user.yml
---
- hosts: all
# vault로 사용자 계정 관련 변수가 정의된 파일을 임포트하여 사용
vars_files:
- vars/users.yml
tasks:
# loop 문을 사용하여 user_info의 userid와 userpw 사용
- name: Create user
ansible.builtin.user:
name: "{{ item.userid }}"
password: "{{ item.userpw | password_hash('sha512', 'mysecret') }}"
state: present
shell: /bin/bash
loop: "{{ user_info }}"
5) 플레이북 실행
플레이북을 실행해 봅니다.
#
ansible-playbook create_user.yml
# 계정 생성 확인
ansible -m shell -a "tail -n 3 /etc/passwd" all
보안 설정 자동화
11.1 패스워드 변경 주기 설정
사전 분석
- 패스워드 변경 주기를 설정할 호스트를 인벤토리를 통해서 설정
- 계정 정보 및 최대 변경일은 별도의 파일로 정의
- 패스워드 변경 주기 설정은 ansible.builtin.user를 통해 설정
플레이북
set_chage_password.yml,
vars_maxdays.yml 파일 생성
1) 플레이북 실행
#
mkdir ~/my-ansible/chapter_11.1
cd ~/my-ansible/chapter_11.1
# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT
cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT
2) 사전형 변수 파일 작성
vars_maxdays.yml
---
Userinfo:
- username: ansible
maxdays: 90
- username: stack
maxdays: 90
3) 플레이북 작성
set_chage_password.yml
---
- hosts: tnode
vars_files: vars_maxdays.yml
tasks:
- name: Change Password Maxdays
ansible.builtin.user:
name: "{{ item.username }}"
password_expire_max: "{{ item.maxdays }}"
loop: "{{ Userinfo }}"
4) 실행
# 문법 체크
ansible-playbook --syntax-check set_chage_password.yml
# 시뮬레이션
ansible-playbook --check set_chage_password.yml
# 확인 : chage -l ansible
man chage
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo chage -l ansible; echo; done
Password expires : never
...
Maximum number of days between password change : 99999
# 실행
ansible-playbook set_chage_password.yml
# 확인 : chage -l ansible
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo chage -l ansible; echo; done
>> tnode1 <<
Last password change : Jan 10, 2024
Password expires : Apr 09, 2024
...
Maximum number of days between password change : 90
첫번째 확인 시 다음과 같이 확인됩니다.
set_chage_password.yml 적용 화면,
(스크린샷에 보시면 저는 change_password라 변경했었습니다.)
적용 후 확인한 내용은 다음과 같습니다.
11.2 패스워드 생성 법칙 적용
내용 정리
- pwquality.conf라는 pam 파일을 활용해 생성 법칙 적용을 할 예정입니다.
리눅스 서버에 libpam-pwquality 패키지가 필요합니다.
- /etc/security/pwquaility.conf 파일을 통해서 패스워드 변경 주기를 설정합니다.
- pwquality.conf는 커스텀 파라미터를 통해 구성되며, Jinja2 템플릿으로 구현합니다.
1) 플레이북 개발
#
mkdir ~/my-ansible/chapter_11.2
cd ~/my-ansible/chapter_11.2
# ansible.cfg, inventory 파일 작성
cat <<EOT> ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT
cat <<EOT> inventory
[tnode]
tnode1
tnode2
tnode3
EOT
2) pwquality.conf.j2 작성
# Created by ansible
{% if minlen is defined %}
# Minimum acceptable size for the new password
minlen = {{ minlen }}
{% endif %}
{% if dcredit is defined %}
# The maximum credit for having digits in the new password
dcredit = {{ dcredit }}
{% endif %}
{% if ucredit is defined %}
# The maximum credit for having uppercase characters in the new password
ucredit = {{ ucredit }}
{% endif %}
{% if lcredit is defined %}
# The maximum credit for having lowercase characters in the new password
lcredit = {{ lcredit }}
{% endif %}
{% if ocredit is defined %}
# The maximum credit for having other characters in the new password
ocredit = {{ ocredit }}
{% endif %}
{% if minclass is defined %}
# The minimum number of required classes of characters for the new password
minclass = {{ minclass }}
{% endif %}
{% if maxrepeat is defined %}
# The maximum number of allowed consecutive same characters in the new password
maxrepeat = {{ maxrepeat}}
{% endif %}
{% if maxclassrepeat is defined %}
# The maximum number of allowed consecutive characters of the same class in the new password
maxclassrepeat = {{ maxclassreapt }}
{% endif %}
{% if retry is defined %}
# Prompt user at most N times before returning with error
retry = {{ retry }}
{% endif %}
{% if enforce_for_root is defined %}
# Enforces pwquality checks on the root user password.
enforce_for_root
{% endif %}
3) 플레이북 작성
set_password_rule.yml
---
- hosts: tnode
vars_files: vars_pw_rule.yml
tasks:
- name: Install libpam-pwquality
ansible.builtin.apt:
name: libpam-pwquality
state: present
when: ansible_facts.os_family == "Debian"
- name: Backup pwquality.conf
ansible.builtin.copy:
src: /etc/security/pwquality.conf
dest: /etc/security/pwquality.conf.bak
remote_src: yes
- name: Copy pwquality.conf.j2 at /etc/security
ansible.builtin.template:
src: pwquality.conf.j2
dest: /etc/security/pwquality.conf
mode: '0644'
4) 플레이북 실행 및 확인
# 문법 체크
ansible-playbook --syntax-check set_password_rule.yml
# 시뮬레이션
ansible-playbook --check set_password_rule.yml
# 실행 전 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo cat /etc/security/pwquality.conf; echo; done
# 실행
ansible-playbook set_password_rule.yml
# 확인
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo ls -l /etc/security; echo; done
for i in {1..3}; do echo ">> tnode$i <<"; ssh tnode$i sudo cat /etc/security/pwquality.conf; echo; done
# 확인 : ansible 계정에 패스워드를 조건이 불충분하도록 입력 시도
ssh tnode2
-----------------
sudo su - ansible
whoami
pwd
passwd ansible
Changing password for ansible.
Current password: ansiblePw1
New password: qwer
BAD PASSWORD: The password contains less than 1 digits
New password: qwer1234
BAD PASSWORD: The password contains less than 1 uppercase letters
New password: Qwer1234
BAD PASSWORD: The password contains less than 1 non-alphanumeric characters
passwd: Have exhausted maximum number of retries for service
passwd: password unchanged
exit
exit
-----------------
위의 내용을 통해서 확인합니다.
대상 노드2에 접속해서 확인해 봅시다.
'DevOps > Ansible' 카테고리의 다른 글
[Ansible 101] 호스트명 설정하기 (0) | 2024.02.04 |
---|---|
[Ansible 101] 환경 설정 자동화 (0) | 2024.02.04 |
[Ansible 101] NTP 서버 설치 및 설정하기 (1) | 2024.02.04 |
[Ansible 101] SSH 키 생성 및 복사하기 (0) | 2024.02.04 |
[Ansible 101] 사용자 계정 생성하기 (1) | 2024.02.04 |