Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
J
joohanhong
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
JooHan Hong
joohanhong
Commits
8e1d6136
Commit
8e1d6136
authored
Mar 10, 2021
by
JooHan Hong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
secure fix, init
parent
b0019cf1
Pipeline
#5141
passed with stages
in 2 seconds
Changes
13
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
974 additions
and
21 deletions
+974
-21
README.md
ANSIBLE/SECURE/CRON/README.md
+81
-0
README.md
ANSIBLE/SECURE/LOGIN/README.md
+66
-0
README.md
ANSIBLE/SECURE/LOGS/README.md
+103
-0
README.md
ANSIBLE/SECURE/MOTD/README.md
+94
-0
README.md
ANSIBLE/SECURE/PAM/COMMON/README.md
+97
-0
README.md
ANSIBLE/SECURE/PAM/TALLY2/README.md
+69
-0
README.md
ANSIBLE/SECURE/PERMISSION/BITS/README.md
+64
-0
README.md
ANSIBLE/SECURE/PERMISSION/FILE/README.md
+101
-0
README.md
ANSIBLE/SECURE/PERMISSION/WWR/README.md
+91
-0
README.md
ANSIBLE/SECURE/PROFILE/README.md
+56
-0
README.md
ANSIBLE/SECURE/README.md
+13
-21
README.md
ANSIBLE/SECURE/SECURETTY/README.md
+61
-0
README.md
ANSIBLE/SECURE/SSHD/README.md
+78
-0
No files found.
ANSIBLE/SECURE/CRON/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/LOGIN/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/LOGS/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/MOTD/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/PAM/COMMON/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/PAM/TALLY2/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/PERMISSION/BITS/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/PERMISSION/FILE/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/PERMISSION/WWR/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/PROFILE/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/README.md
View file @
8e1d6136
...
...
@@ -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
)
| |
ANSIBLE/SECURE/SECURETTY/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
ANSIBLE/SECURE/SSHD/README.md
0 → 100644
View file @
8e1d6136
[
![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
```
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment