-
[Ansible 101] 보안 설정IT/Ansible 2024. 2. 12. 21:46728x90
안녕하세요, 오늘 내용은 앤서블을 활용하여 보안 설정을 하는 내용을 다룹니다.
사전 준비
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에 접속해서 확인해 봅시다.
728x90반응형'IT > Ansible' 카테고리의 다른 글
[Ansible 101] 호스트명 설정하기 (0) 2024.02.04 [Ansible 101] 환경 설정 자동화 (0) 2024.02.04 [Ansible 101] NTP 서버 설치 및 설정하기 (0) 2024.02.04 [Ansible 101] SSH 키 생성 및 복사하기 (0) 2024.02.04 [Ansible 101] 사용자 계정 생성하기 (0) 2024.02.04