Commit 8e1d6136 authored by JooHan Hong's avatar JooHan Hong

secure fix, init

parent b0019cf1
Pipeline #5141 passed with stages
in 2 seconds
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> cron 설정 중 cron.deny 파일 및 설정이 존재하지않을 경우 취약하므로, 이를 Fix 한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: cron Secure Fix
hosts: ALL_HOSTS
tasks:
- name: Copy the CRON cron.allow file in remote node
copy:
src: templates/cron.allow.j2
dest: /etc/cron.allow
owner: root
group: root
mode: 0640
- name: Copy the CRON cron.deny file in remote node
copy:
src: templates/cron.deny.j2
dest: /etc/cron.deny
owner: root
group: root
mode: 0640
```
위의 cron.allow, cron.deny 파일의 내역은 다음과 같다.
```bash
# cat templates/cron.allow.j2
root
# cat templates/cron.deny.j2
```
> cron.deny 파일에 아무런 사용자가 없어도 반드시 등록해야 한다. 즉, 위의 설정은 root 유저를 제외한 모든 사용자의 cron을 제한하겠다는 설정이다.
`보안취약점 조치`에 대한 Playbook 분석
* [ ] copy 모듈을 사용하여, 기존에 검증된 파일을 원격서버에 복사한다.
## playbook 실행
```bash
# ansible-playbook -i hosts cron_deny.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 사용자 패스워드정책파일(/etc/login.defs)에 대한 설정취약점을 조치한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS Secure Fix
hosts: ALL_HOSTS
tasks:
- name: Modify Password Min Length
lineinfile: dest=/etc/login.defs regexp="PASS_MIN_LEN" line="PASS_MIN_LEN 8" state=present
- 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
- 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
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] lineinfile 모듈을 사용하여, 정책에 맞게 내역을 수정한다.
- PASS_MIN_LEN : 패스워드 최소길이
- PASS_MAX_DAYS : 패스워드 최대사용기간
- PASS_MIN_DAYS : 패스워드 변경 후 최소로 사용해야하는 기간
## playbook 실행
```bash
# ansible-playbook -i hosts login_defs.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 내부 로그서버로의 전송 미설정 취약점을 조치한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS logs setting Secure Fix
hosts: ALL_HOSTS
vars:
time: "{{lookup('pipe','date \"+%Y%m%d\"')}}"
log_server: "172.16.0.254"
tasks:
- name: /root/test Directory Create
command: mkdir -p /root/test
- name: /root/test/rsyslog_config_{{ time }} file copy check
stat:
path: /root/test/rsyslog.conf_{{ time }}
register: rsyslog_config_backup
- name: /etc/rsyslog.conf_{{ time }} file backup
command: cp -rf /etc/rsyslog.conf /root/test/rsyslog.conf_{{ time }}
when: rsyslog_config_backup.stat.exists == False
- name: Copy the Rsyslog Configs file file in remote node
copy:
src: templates/rsyslog.conf.j2
dest: /etc/rsyslog.conf
owner: root
group: root
mode: 0644
register: rsyslog_config
- name: rsyslog Daemon Reloaded Service
service:
name: rsyslog
state: restarted
enabled: yes
when: rsyslog_config.changed
```
rsyslog.conf.j2 파일의 변경내역은 다음과 같다.
```bash
auth,authpriv.* @{{ log_server }}
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none @{{ log_server }}
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] copy 모듈을 사용하여, 원격 시스템에 배너를 설정한다.
* [ ] Jinja2 템플릿을 사용하여, 원격 시스템의 /etc/rsyslog.conf 파일을 배포한다.
## playbook 실행
```bash
# ansible-playbook -i hosts rsyslog_set.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 시스템 접근 시 경고사항에 대한 미설정 취약점을 조치한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: MOTD(Banner) Not Set Secure Fix
hosts: ALL_HOSTS
tasks:
- name: Copy the banner issue file in remote node
copy:
src: templates/issue.j2
dest: /etc/issue
owner: root
group: root
mode: 0644
- name: Copy the banner motd file in remote node
copy:
src: templates/issue.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
- name: Copy the banner issue.net file in remote node
copy:
src: templates/issue.j2
dest: /etc/issue.net
owner: root
group: root
mode: 0644
- name: /etc/ssh/sshd_config Banner Configure
lineinfile: dest=/etc/ssh/sshd_config regexp="^#?Banner" line="Banner /etc/issue.net" state=present
```
issue.j2 파일의 내역은 다음과 같다.
```bash
# cat templates/issue.j2
####################################################################
# #
# All access and usage is monitored and recorded #
# and can be provided evidence as court or related organization. #
# #
####################################################################
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] copy 모듈을 사용하여, 원격 시스템에 배너를 설정한다.
* [ ] /etc/ssh/sshd_config 파일에 Banner 설정이 없다면, 이를 /etc/issue.net으로 적용한다.
## playbook 실행
```bash
# ansible-playbook -i hosts motd_issue.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 사용자 패스워드에 대한 정책 취약점을 Fix 한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: User Password Policy Fix (PAM)
hosts: TEST
vars:
time: "{{lookup('pipe','date \"+%Y%m%d\"')}}"
environment:
LANG: ko_KR.UTF-8
tasks:
- name: /root/test Directory Create
command: mkdir -p /root/test
- name: /root/test/common-password_{{ time }} file copy check
stat:
path: /root/test/common-password_{{ time }}
register: common_password_config_backup
- name: /etc/pam.d/common-password_{{ time }} file backup
command: cp -rf /etc/pam.d/common-password /root/test/common-password_{{ time }}
when: common_password_config_backup.stat.exists == False
- name: Copy the /etc/pam.d/common-password file in remote node
copy:
src: templates/common-password
dest: /etc/pam.d/common-password
owner: root
group: root
mode: 0644
register: common_password_config
- name: Restrict Access to the su Command
lineinfile:
dest: /etc/pam.d/su
regexp: '# auth required pam_wheel.so'
line: 'auth required pam_wheel.so use_uid'
state: present
```
templates/common-password 파일내용은 다음과 같다.
```bash
password [success=1 default=ignore] pam_unix.so obscure sha512
password requisite pam_deny.so
password required pam_permit.so
password requisite pam_cracklib.so retry=3 minlen=8 lcredit=1 ucredit=1 dcredit=1 ocredit=1
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] Fix 하기전에 /etc/pam.d/common-password 파일을 일자(YYYY-MM-DD) 기준으로 백업(stat, command 모듈)한다.
* [ ] 검증된 파일을 원격시스템에 COPY(copy 모듈) 한다.
* [ ] wheel 그룹만 root로 전환할 수 있게 설정(pam_wheel)을 진행한다.
## playbook 실행
```bash
# ansible-playbook -i hosts pam_common.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 접속 시 사용자 패스워드의 missmatch count를 제한하고, Block을 수행하는 pam_tally2 모듈을 적용한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS Secure Fix
hosts: ALL_HOSTS
tasks:
- name: Account Pam_tally2 Setting
lineinfile:
path: /etc/pam.d/common-auth
insertbefore: BOF
regexp: "pam_tally2.so"
line: "auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900"
when: ansible_distribution == "Debian"
- name: Account Pam_tally2 Setting
lineinfile:
dest: '/etc/pam.d/system-auth'
regexp: "pam_tally2.so"
line: "auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900"
state: present
when: ansible_distribution == "CentOS"
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] OS 별 설정을 Facts 변수(ansible_distribution)로 구분하여, 적용한다.
## playbook 실행
```bash
# ansible-playbook -i hosts pam_tally2.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 시스템 내에 SUID, SGID Bit가 설정된 파일에 설정을 제거한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: SUID/SGID Bits Remove
hosts: ALL_HOSTS
tasks:
- name: Remove SGID, SUID Permission Bit
file:
path: "{{ item }}"
owner: root
group: root
mode: 00755
with_items:
- /usr/bin/newgrp
- /sbin/unix_chkpwd
- /usr/bin/at
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] SUID(4xxx), SGID(X200) 가 적용된 파일 중 보안에 취약점 명령을 755로 설정한다.
## playbook 실행
```bash
# ansible-playbook -i hosts suid_sgid_remote.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 시스템사용자 데이터베이스 파일인 /etc/passwd, /etc/group, /etc/shadow 파일에 대한 권한을 점검한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS User Database File Secure Check & Fix
hosts: ALL_HOSTS
tasks:
- name: /etc/passwd file check
stat: path=/etc/passwd
register: passwd_check
- name: /etc/passwd permission set Execute...
command: chmod 644 /etc/passwd
when: passwd_check.stat.mode != 644
- name: /etc/passwd owner set Execute...
command: chown root. /etc/shadow
when: passwd_check.stat.pw_name != 'root'
- name: /etc/passwd group set Execute...
command: chown .root /etc/shadow
when: passwd_check.stat.gr_name != 'root'
- name: /etc/group file check
stat: path=/etc/group
register: group_check
- name: /etc/group permission set Execute...
command: chmod 644 /etc/group
when: group_check.stat.mode != 644
- name: /etc/group owner set Execute...
command: chown root. /etc/group
when: group_check.stat.pw_name != 'root'
- name: /etc/group group set Execute...
command: chown .root /etc/group
when: group_check.stat.gr_name != 'root'
- name: /etc/shadow file check
stat: path=/etc/shadow
register: shadow_check
- name: /etc/shadow permission set Execute...
command: chmod 640 /etc/shadow
when: shadow_check.stat.mode != 640
- name: /etc/shadow owner set Execute...
command: chown root. /etc/shadow
when: shadow_check.stat.pw_name != 'root'
- name: /etc/shadow group set Execute...
command: chown .shadow /etc/shadow
when: shadow_check.stat.gr_name != 'shadow'
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] 각 파일에 대한 권한,소유자,그룹 권한을 점검(stat)하여, 정책에 맞지 않다면(when) 설정을 수행한다.
## playbook 실행
```bash
# ansible-playbook -i hosts os_user_files.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 특별한 사유가 없는 World Write Able(Other User의 Write 권한)이 존재하는 파일이나 디렉토리의 권한을 조치한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS PACKAGE_QUERY Action
hosts: ALL_HOSTS
vars:
time_d: "{{lookup('pipe','date \"+%Y%m%d\"')}}"
time_m: "{{lookup('pipe','date \"+%Y%m%d_%H%M\"')}}"
tasks:
- name: command set Execute...
shell: "{{ item }}"
with_items:
- chmod 644 /etc/hosts
- chmod 644 /etc/passwd
- name: file stat check
stat:
path: "{{ item }}"
with_items:
- /etc/hosts
- /etc/passwd
register: file_stat
- debug: var=file_stat
- name: file stat command check
shell: "{{ item }}"
with_items:
- ls -al /etc/hosts
- ls -al /etc/passwd
register: file_stat_command
- debug: var=file_stat_command
- name: Local Directory Create
local_action: command mkdir -p PERMISSION_SET/{{ managed_ip }}/{{ time_d }}
- name: Command Result Local Stored
local_action: copy content={{ file_stat_command.results }} dest=PERMISSION_SET/{{ managed_ip }}/{{ time_d }}/command_result_{{ time_m }}.txt
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] 취약점을 조치할 명령(권한 조치)을 설정하며, with_item 모듈에 따라 다중으로 지정할 수 있다.
* [ ] 수행 후 증적을 남기기 위해 로컬에 다음과 같이 txt 파일을 기록한다.
- time_d : 현재 일자기준
- time_m : 수행 기준(분 단위)
## playbook 실행
```bash
# ansible-playbook -i hosts world_write_able_fix.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> 시스템 로그인 후 계속 유지하는 취약점을 방지하기 위해 Timeout 설정을 적용한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS Secure Fix
hosts: ALL_HOSTS
tasks:
- name: Login TimeOut Setting 600 seconds
lineinfile: dest=/etc/profile regexp="^TMOUT" line="TMOUT=600" state=present
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] lineinfile 모듈을 사용하여, TMOUT 설정이 없다면, TMOUT=600 설정을 추가한다.
## playbook 실행
```bash
# ansible-playbook -i hosts profile_tmout.yml
```
......@@ -2,29 +2,21 @@
# Ansible 활용
> OS 보안취약점 조치작업을 수행한다.
> OS 보안취약점 조치작업을 자동화 한다.
# Table of Contents
| NO | ITEM | Content | 비고 |
| ------ | ------ | ------ | ------ |
| 1 | MariaDB Install | [GO](./MariaDB/) | |
| 2 | OS Package Installing (apt) | [GO](./APT/) | |
1. /etc/securetty, 권한점검
2. /etc/ssh/sshd_config, 설정 취약점
3. pam_common, 패스워드 취약점
4. pam_tally2, 설정 취약점
5. /etc/passwd, /etc/group, /etc/shadow, 파일의 권한 취약점
6. /etc/hosts, 파일의 권한 취약점
7. suid,sgid,sticky, 설정 bit 제거 및 적용
8. cron deny 설정
9. su, pam_wheel 모듈적용 취약점
10. login_defs, 설정 취약점
11. issue_motd, 설정 취약점
12. rsyslog, 설정 취약점
13. /etc/profile, TMOUT 설정취약점
14. Banner 설정 취약점
| 1 | /etc/securetty 점검 | [GO](./SECURETTY/) | |
| 2 | sshd_config 설정 취약점 | [GO](./SSHD/) | |
| 3 | common-password (PAM) 설정 취약점 | [GO](./PAM/COMMON/) | |
| 4 | pam_tally2 (PAM) 설정 취약점 | [GO](./PAM/TALLY2) | |
| 5 | 리눅스 계정파일 권한 취약점 | [GO](./PERMISSION/FILE) | |
| 6 | SUID,SGID,STICKBIT 설정 취약점 | [GO](./PERMISSION/BITS) | |
| 7 | cron Deny 설정 취약점 | [GO](./CRON/) | |
| 8 | login.defs 설정 취약점 | [GO](./LOGIN/) | |
| 9 | issue MOTD(Banner) 설정 취약점 | [GO](./MOTD/) | |
| 10 | rsyslog 설정 취약점 | [GO](./LOGS/) | |
| 11 | TMOUT (/etc/profile) 설정 취약점 | [GO](./PROFILE/) | |
| 12 | World Writealbe 설정 취약점 | [GO](./PERMISSION/WWR) | |
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> /etc/securetty 파일에 root 유저가 원격 터미널(pts)로 접속할 수 없게 조치한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: OS Secure Fix
hosts: ALL_HOSTS
vars:
time: "{{lookup('pipe','date \"+%Y%m%d\"')}}"
tasks:
- name: Disable root remote access - commenting pts
replace: dest=/etc/securetty
regexp="^pts"
replace="#pts"
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] 원격 호스트의 /etc/securetty 파일에 pts 터미널을 주석처리 한다.
* [ ] ansible의 replace 모듈을 사용하며, 주석처리가 없는 pts 구문이 검출되면(^pts) 주석처리(#pts) 한다.
## playbook 실행
```bash
# ansible-playbook -i hosts securetty.yml
```
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 보안취약점 조치
> /etc/ssh/sshd_config 설정에 PermitRootLogin yes 설정을 no로 조치한다.
## Inventory 설정
```bash
# cat hosts
[ALL_HOSTS]
172.16.0.100 managed_ip=172.16.0.100 des="2020-12-03"
[ALL_HOSTS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **ALL_HOSTS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# 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 설정
```python
---
- name: SSHD SecureVal Fix
hosts: ALL_HOSTS
vars:
time: "{{lookup('pipe','date \"+%Y-%m-%d\"')}}"
tasks:
- name: Disable root login over SSH Comment absent
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^#PermitRootLogin"
line: ""
state: absent
- name: Disable root login over SSH
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^PermitRootLogin"
line: "PermitRootLogin no"
state: present
notify:
- reload sshd
handlers:
- name: reload sshd
systemd:
name: sshd
state: reloaded
```
`보안취약점 조치`에 대한 Playbook 분석
* [ ] 원격 호스트의 /etc/ssh/sshd_config 파일에 #PermitRootLogin 지시자가 존재할 경우 제거(absent)한다(향후 주석을 해제할 수 있으므로).
* [ ] PermiitRootLogin 지시자가 없는 경우(주석된 지시자는 미해당) PermitRootLogin no 를 설정파일에 적용한다.
## playbook 실행
```bash
# ansible-playbook -i hosts ssh_permitrootno.yml
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment