728x90

 

안녕하세요, 오늘 내용은 앤서블을 활용하여 보안 설정을 하는 내용을 다룹니다.

 

사전 준비

 

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) 실행

chage

 

# 문법 체크
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에 접속해서 확인해 봅시다.

 

 

728x90
반응형