-
오픈소스로 구성하는 데브옵스 시스템 - Ansible과 AWX를 이용한 예제2DevOps 2018. 3. 20. 00:57
계속해서 Ansible과 AWX를 이용해서 Linux와 Windows 서버를 일괄로 관리 할 수 있는 환경을 구성해 보겠습니다
지난글에 이어서 이번에는 보안 관련 설정 스크립트 예제 입니다.
Linux의 보안 관리 (for CentOS7)
저의 경우 Provisioning이 없는 환경에서 ISMS 심사 기간이 되면 심사 준비와 이후 결함 보완으로 최소 3개월의 시간이 소요 되었습니다. 운영 장비와 VM까지 수백여대가 되는 장비와 application의 설정을 일일히 확인하고 수정하는 작업은 엄청난 노가다 일 수 밖에 없습니다.
관련하여 이제는 Ansible을 이용한 관리가 가능하도록 아래 예제 코드를 적용해 보았습니다.
이제 기존 서버는 물론이고 신규 서버가 추가되어도 ansible에서 Template job 실행 버튼만 눌러주면 됩니다.
1. root 계정 원격 접속 제한
root 계정은 시스템을 관리하는 매우 중요한 계정 입니다. 시스템 관리자는 대부분 root 계정으로 직접 로그인하도록 하는 것을 방지하고 있습니다. 간혹 root 로그인의 편리함에 원격 접속을 허용하지만, 반드시 계정 접속에 대한 제한 관리가 필요합니다.
---
- hosts: all
remote_user: ansible
tasks:
- name: Disable root remote access - commenting pts
replace: dest=/etc/securetty
regexp="^pts"
replace="#pts"
become: yes
become_user: root
- name: PermitRootLogin no
lineinfile: dest=/etc/ssh/sshd_config
regexp="PermitRootLogin[\s\x20]*(yes|no)"
line="PermitRootLogin no"
state=present
become: yes
become_user: root
2. 계정 장금 임계값 설정
패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측공격(Password Guessing) 발생 시 암호입력 실패 횟수를 적절하게 제한함으로써 자동 공격을 차단하고 공격 시간을 지체시켜 패스워드 유출 위혐을 줄입니다.
---
- hosts: all
remote_user: ansible
tasks:
- name: modify auth required
lineinfile: dest=/etc/pam.d/system-auth
regexp="^auth[\s\x20]*required[\s\x20]*(pam_env.so|pam_tally2.so)"
line="auth required pam_tally2.so deny=5 unlock_time=120 no_magic_root"
state=present
become: yes
become_user: root
- name: modify account requisite
lineinfile: dest=/etc/pam.d/system-auth
regexp="^account[\s\x20]*required[\s\x20]*(pam_unix.so|pam_tally2.so)"
line="account required pam_tally2.so no_magic_root reset"
state=present
become: yes
become_user: root
- name: modify password requisite
lineinfile: dest=/etc/pam.d/system-auth
regexp="^password[\s\x20]*requisite"
line="password requisite pam_cracklib.so try_first_pass retry=3 lcredit=1 dcredit=-1 ocredit=1"
state=present
become: yes
become_user: root
- name: modify password sufficient
lineinfile: dest=/etc/pam.d/system-auth
regexp="^password[\s\x20]*sufficient*"
line="password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=1"
state=present
become: yes
become_user: root
- name: modify auth required
lineinfile: dest=/etc/pam.d/password-auth
regexp="^auth[\s\x20]*required[\s\x20]*(pam_env.so|pam_tally2.so)[\s\x20]*"
line="auth required pam_tally2.so deny=3 unlock_time=60"
state=present
become: yes
become_user: root
- name: modify account required
lineinfile: dest=/etc/pam.d/password-auth
regexp="^account[\s\x20]*required[\s\x20]*(pam_unix.so|pam_tally2.so)[\s\x20]*"
line="account required pam_tally2.so"
state=present
become: yes
become_user: root
3. 패스워드 사용기간 및 최소길이 설정
악의적인 사용자에게 유출된 패스워드를 계속적으로 사용하지 못하도록 패스워드 사용기간을 설정합니다.
또한 사용자가 패스워드 설정시 최소자리 이상을 설정하도록 셋팅 합니다.
---
- hosts: all
remote_user: ansible
tasks:
- name: modify password max days
lineinfile: dest=/etc/login.defs
regexp="^PASS_MAX_DAYS[\s\x20]*[0-9]*"
line="PASS_MAX_DAYS 90"
state=present
become: yes
become_user: root
- name: modify password min days
lineinfile: dest=/etc/login.defs
regexp="^PASS_MIN_DAYS[\s\x20]*[0-9]*"
line="PASS_MIN_DAYS 1"
state=present
become: yes
become_user: root
- name: modify password min length
lineinfile: dest=/etc/login.defs
regexp="^PASS_MIN_LEN[\s\x20]*[0-9]*"
line="PASS_MIN_LEN 8"
state=present
become: yes
become_user: root
4. Session Timeout 설정
관리자가 계정을 접속하고 방치될 경우 다른 사용자에게 시스템이 노출되어 악의적인 목적으로 사용될 수 있으므로 일정 시간 이후 아무런 이벤트가 발생하지 않으면 연결을 종료시키도록 Session Timeout을 설정 합니다.
---
- hosts: all
remote_user: ansible
tasks:
- name: set time out 900s
lineinfile: dest=/etc/profile
regexp="^(export|EXPORT)[\s\x20]*TMOUT=[0-9]*"
line="export TMOUT=900"
state=present
become: yes
become_user: root
5. 불필요 계정 삭제
OS나 Package 설치 시 Default로 생성되는 계정(특히 FTP)은 대부분 Default 패스워드를 사용하는 경우가 많아 패스워드 추측공격에 노출 될 수 있습니다. 이를 방지하기 위해 Default 계정 및 사용하지 않는 계정은 삭제하도록 합니다.
---
- hosts: all
remote_user: ansible
tasks:
- name: Anonymous FTP User Delete
user: name="{{ del_user }}"
state=absent
remove=yes
force=yes
become: yes
become_user: root
해당 Job을 만들 때, EXTRA VAIRABLES 입력란에 아래와 같이 key: value 조합으로 값을 입력 합니다.
6. /etc/passwd 파일 소유자 및 권한 설정
/etc/passwd 파일은 사용자의 ID, 패스워드, UID, GID 등의 정보를 담고 있기에 관리자 이외의 사용자가 접근하지 못하도록 제한 합니다.
---
- hosts: all
remote_user: ansible
tasks:
- name: chagne file owner
file: path=/etc/passwd
owner=root
group=root
mode=0644
become: yes
become_user: root
'DevOps' 카테고리의 다른 글
오픈소스로 구성하는 데브옵스 시스템 - Ansible의 Dynamic Inventory (5) 2018.06.05 오픈소스로 구성하는 데브옵스 시스템 - Ansible과 AWX를 이용한 예제3 (9) 2018.05.31 오픈소스로 구성하는 데브옵스 시스템 - Ansible과 AWX를 이용한 예제1 (2) 2018.03.06 오픈소스로 구성하는 데브옵스 시스템 - Ansible과 AWX에서 윈도우 서버 관리 (0) 2018.03.03 오픈소스로 구성하는 데브옵스 시스템 - AWX에서 Ansible 실행 (0) 2018.02.13