Name
Last commit
Last update
..
README.md ansible, 2021-03-08, update4

logo

Ansible을 이용한 사용자계정 관리

사용자의 추가/제거을 수행하고, 추가적으로 ssh의 Allow 설정을 적용한 후 txt 파일로 수행하는 시스템(PC 또는 서버)에 증적을 남긴다.

주요 기능

  • 리눅스 사용자에 대한 추가를 수행한다.
  • ssh 설정에 AllowUsers 또는 AllowGroup 설정을 수행할 수 있다.
  • 수행 후 증적을 위해 현재 로컬에 IP주소/날짜(YYYY-MM-DD)/사용자아이디/사용자아이디_허용IP.txt 파일을 기록한다.

Inventory 설정

# cat hosts
[USERS]
172.16.0.100 managed_ip=172.16.0.100 des="test user add, 2020-12-03"

[USERS_OK]

대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 USERS_OK 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.

Host Variables 설정

# cat host_vars/172.16.0.100
ansible_ssh_host: 172.16.0.100
ansible_ssh_port: SSH_포트번호
ansible_ssh_user: 사용자 아이디
ansible_ssh_pass: "사용자 패스워드"
ansible_become: yes
ansible_become_method: su
ansible_become_user: root
ansible_become_pass: "!root_패스워드"
ansible_python_interpreter: python2.7

Playbook 설정

  • 사용자 추가
---
- name: System User Additional
  hosts: USERS
  vars:
    add_user_name: '사용자 아이디'
    user_password: '사용자 패스워드'
    allow_ip: '사용자의 PC IP주소'
    time: "{{lookup('pipe','date \"+%Y-%m-%d\"')}}"
    allow_user_check: '{{ add_user_name }}@{{ allow_ip }}'
  tasks:
  - name: Local Directory Create
      local_action: command mkdir -p USER_ADD/{{ managed_ip }}/{{ time }}/{{ user_name }}

  - name: New System User Add
    user:
        name: "{{ add_user_name }}"
        password: "{{ user_password | password_hash('sha512') }}"
        shell: /bin/bash

  - name: wheel Group Add
    group:
      name: wheel
      state: present

  - name: User Add Wheel Group
    shell: usermod -G wheel {{ add_user_name }}

  - name: AllowUsers checking
    shell: cat /etc/ssh/sshd_config |grep "AllowUsers {{ allow_user_check }}" |wc -l
    register: allowuser_exist

  - debug: var=allowuser_exist.stdout

  - name: /etc/ssh/sshd_config Add AllowUsers
    shell: echo "AllowUsers {{ allow_user_check }}" >> /etc/ssh/sshd_config
    when: allowuser_exist.stdout == "0"

  - name: sshd Daemon Restart
    service:
        name: ssh.service
        state: reloaded
        enabled: yes
    when: allowuser_exist.stdout == "0"

  - name: System User AllowIP Result
      local_action: copy content={{ allow_ip }} dest=USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}/{{ user_name }}_allowip.txt
      when: allowuser_exist.stdout == "0"

사용자 추가에 대한 Playbook 분석

  • 추가하려는 사용자에 대한 아이디(add_user_name)/패스워드(user_password)/IP주소(allow_ip)는 변수로 설정한다.
  • root 유저로의 전환은 wheel 그룹에 속한 사용자만 가능하므로, wheel 그룹에 추가한다.
  • 만약 기존 사용자의 정보가 존재한다면, AllowUsers 설정이 불필요하므로, 체크한다(allowuser_exist 변수).
  • 사용자가 존재하지않는다면(allowuser_exist.stdout == "0"), /etc/ssh/sshd_config에 AllowUsers 설정을 추가한 sshd 서비스데몬을 reload 한다.
  • 사용자 제거
---
- name: System User Additional
  hosts: USERS
  vars:
    del_user_name: '사용자 아이디'
    allow_ip: '사용자의 PC IP주소'
    time: "{{lookup('pipe','date \"+%Y-%m-%d\"')}}"
  tasks:
  - name: Local Directory Create
      local_action: command mkdir -p USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}

  - name: System User Exist Check
      shell: id -u "{{ user_name }}"
      register: user_exists
      ignore_errors: True

  - name: System User Remove
      user: name={{ user_name }}
            state=absent
            force=yes
            remove=yes #사용자 홈디렉토리를 포함한 모든 설정을 지운다.
      when: user_exists.rc == 0

  - name: User Remove Whell Group
      shell: usermod -G "" {{ user_name }}
      when: user_exists.rc == 0

  - name: User Remove sshd_config AllowUsers
    lineinfile:
         dest: /etc/ssh/sshd_config
         regexp: "^AllowUsers {{ user_name }}@{{ allow_ip }}"
         state: absent
      ignore_errors: True
    when: user_exists.rc == 0

  - name: sshd Daemon Restart
    service:
        name: ssh.service
        state: reloaded
        enabled: yes
    when: user_exists.rc == 0

  - name: System User Password Modify Result
    local_action: copy content={{ user_exists }} dest=USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}/{{ user_name }}_result.txt
    when: user_exists.rc == 0

  - name: System User AllowIP Result
      local_action: copy content={{ allow_ip }} dest=USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}/{{ user_name }}_allowip.txt
      when: user_exists.rc == 0

사용자 제거에 대한 Playbook 분석

  • 제거하려는 사용자에 대한 아이디(del_user_name)/IP주소(allow_ip)는 변수로 설정한다.
  • 사용자의 모든 그룹을 제거한다. 물론 이 과정은 wheel에 추가된 내역을 지우는데 목적이 있다.
  • 사용자를 제거한다. 여기서 주의할 사항은 remove=yes로 인해 홈 디렉토리의 데이터까지 모두 제거된다.
  • /etc/ssh/sshd_config 파일에 AllowUsers 설정을 지우는데, 해당 유저정보가 Match하면 지우게 된다.

playbook 실행

  • 사용자 추가
# ansible-playbook -i hosts user_add.yml
  • 사용자 제거
# ansible-playbook -i hosts user_del.yml

수행 결과

# ls USER_DEL/172.16.0.100/2020-12-03/test/test_allowip.txt
USER_DEL/10.130.10.79/2021-03-08/test/test_allowip.txt

# cat USER_DEL/172.16.0.100/2020-12-03/test/test_allowip.txt
172.16.0.100