ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Ansible 101] 보안 설정
    IT/Ansible 2024. 2. 12. 21:46
    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
    반응형
Designed by Tistory.