실습 Ansible Playbook 실습 - 취약점 분석 점검 항목 - root 계정 원격 접속 제한 - 설계 2
페이지 정보
작성자 꿈꾸는여행자 작성일 25-02-14 13:24 조회 2,884 댓글 0본문
안녕하세요.
꿈꾸는여행자입니다.
Ansible을 통한 Playbook을 활용 분야에는 Unix 취약점 분석 점검 항목이 있습니다.
다음 kisa에서 제공된 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드 를
기준으로 Playbook을 작성해 보고자합니다.
https://www.kisa.or.kr/2060204/form?postSeq=12&lang_type=KO&page=1
해당 항목들을 설계 및 구현 해보는 과정을 진행하고자 합니다.
이번 항목에서는 다음 내용을 기준으로
설계해 보겠습니다.
0. 인벤토리 관리
- Inventory 정보를 그룹화
감사합니다.
> 아래
다음은 요청하신 **SOLARIS, AIX, HP-UX, RHEL5, RHEL7, Rocky8, Ubuntu22** 기준으로 OS별 그룹을 나누어 Ansible Role을 활용하여 자동으로 그룹을 생성하는 Playbook 구성입니다.
---
## ** 1. 디렉토리 구조 (OS별 그룹 자동 생성 포함)**
```
ansible-security/
├── inventory/
│ ├── production # IP만 있는 인벤토리
├── group_vars/ # OS별 변수 관리
│ ├── solaris.yml
│ ├── aix.yml
│ ├── hpux.yml
│ ├── rhel5.yml
│ ├── rhel7.yml
│ ├── rocky8.yml
│ ├── ubuntu22.yml
├── playbooks/
│ ├── compliance.yml # 보안 점검 Playbook
│ ├── hardening.yml # 보안 조치 Playbook
│ ├── generate_inventory.yml # OS별 그룹 자동 생성 Playbook
├── roles/
│ ├── inventory_generator/ # OS별 그룹 자동 생성 역할
│ │ ├── tasks/
│ │ │ ├── main.yml # 메인 Task (check & generate 실행)
│ │ │ ├── check.yml # 점검 Task (OS 확인)
│ │ │ ├── generate.yml # OS별 그룹 생성
│ │ ├── defaults/
│ │ │ ├── main.yml # 기본 변수 설정
│ │ ├── templates/
│ │ │ ├── inventory_os_group.j2 # 동적으로 생성할 인벤토리 템플릿
│ │ ├── handlers/
│ │ │ ├── main.yml # 핸들러
├── site.yml
```
---
## ** 2. `roles/inventory_generator` Role 구성**
### **1) OS별 그룹 점검 (`check.yml`)**
이 Task는 대상 서버의 OS 정보를 확인하여 Ansible Facts를 가져옵니다.
#### `roles/inventory_generator/tasks/check.yml`
```yaml
---
- name: Gather OS distribution and family
set_fact:
os_group: >-
{% if ansible_distribution == "Solaris" %}
solaris
{% elif ansible_distribution == "AIX" %}
aix
{% elif ansible_distribution == "HP-UX" %}
hpux
{% elif ansible_distribution == "RedHat" and ansible_distribution_version is version('6.0', '<') %}
rhel5
{% elif ansible_distribution == "RedHat" and ansible_distribution_version is version('6.0', '>=') and ansible_distribution_version is version('8.0', '<') %}
rhel7
{% elif ansible_distribution == "Rocky" %}
rocky8
{% elif ansible_distribution == "Ubuntu" and ansible_distribution_version is version('22.04', '>=') %}
ubuntu22
{% else %}
unknown
{% endif %}
- name: Display detected OS Group
debug:
msg: "Host {{ inventory_hostname }} belongs to OS Group: {{ os_group }}"
```
**설명**
- `ansible_distribution` 값과 `ansible_distribution_version`을 활용하여 OS 그룹을 설정.
- `rhel5`, `rhel7`, `rocky8`, `ubuntu22`, `aix`, `hpux`, `solaris` 그룹을 자동 생성.
---
### **2) OS별 그룹을 Inventory에 추가 (`generate.yml`)**
이 Task는 OS 그룹을 동적으로 Inventory에 추가합니다.
#### `roles/inventory_generator/tasks/generate.yml`
```yaml
---
- name: Add hosts to OS-specific groups dynamically
add_host:
name: "{{ inventory_hostname }}"
groups: "{{ os_group }}"
```
**설명**
- `add_host` 모듈을 사용하여 현재 호스트를 해당 OS 그룹에 동적으로 추가.
---
### **3) OS별 그룹을 Inventory 파일에 저장 (`inventory_os_group.j2`)**
OS별 그룹을 **Jinja2 템플릿**을 사용하여 **Inventory 파일로 변환**합니다.
#### `roles/inventory_generator/templates/inventory_os_group.j2`
```jinja
{% for group, hosts in groups.items() %}
[{{ group }}]
{% for host in hosts %}
{{ host }}
{% endfor %}
{% endfor %}
```
**설명**
- `groups.items()`를 활용하여 Ansible이 감지한 모든 OS 그룹을 반복하여 Inventory 파일 생성.
---
### **4) OS 그룹 Inventory 파일을 생성 (`main.yml`)**
이 Task는 **OS별 그룹 정보를 Inventory 파일로 저장**합니다.
#### `roles/inventory_generator/tasks/main.yml`
```yaml
---
- import_tasks: check.yml
- import_tasks: generate.yml
- name: Save OS Group Inventory
template:
src: inventory_os_group.j2
dest: inventory/production_os_group.yml
delegate_to: localhost
```
**설명**
- OS 정보 확인 → OS 그룹 생성 → OS별 Inventory 파일 저장 (템플릿 사용).
---
## ** 3. `generate_inventory.yml` Playbook**
이 Playbook을 실행하면 **OS별 그룹이 자동으로 생성된 Inventory 파일을 생성**합니다.
#### `playbooks/generate_inventory.yml`
```yaml
---
- name: Generate OS-based Inventory
hosts: all
gather_facts: yes
roles:
- inventory_generator
```
**설명**
- `inventory_generator` 역할을 실행하여 OS 그룹을 자동으로 생성.
---
## ** 4. 실행 방법**
### **1) OS별 그룹을 자동 생성**
```bash
ansible-playbook -i inventory/production playbooks/generate_inventory.yml
```
**출력 예시**
```
TASK [Gather OS distribution and family] *******************************
ok: [192.168.1.10] => (item=Rocky Linux)
ok: [192.168.1.11] => (item=Ubuntu 22.04)
ok: [192.168.1.12] => (item=RHEL 7)
ok: [192.168.1.20] => (item=AIX 7.2)
TASK [Add hosts to OS-specific groups dynamically] **********************
ok: [192.168.1.10] => (group=rocky8)
ok: [192.168.1.11] => (group=ubuntu22)
ok: [192.168.1.12] => (group=rhel7)
ok: [192.168.1.20] => (group=aix)
TASK [Save OS Group Inventory] *****************************************
ok: [localhost] => (file=inventory/production_os_group.yml)
```
**결과**
- OS 그룹이 자동으로 생성된 `inventory/production_os_group.yml`이 저장됨.
---
### **2) 자동 생성된 OS별 그룹으로 보안 점검 실행**
```bash
ansible-playbook -i inventory/production_os_group.yml playbooks/compliance.yml
```
**출력 예시**
```
TASK [Check if SSH root login is disabled] *******************************
ok: [192.168.1.10] => msg: PermitRootLogin no (Rocky)
ok: [192.168.1.11] => msg: PermitRootLogin yes (Ubuntu 22.04, 취약)
```
---
## ** 5. 결론**
**Playbook을 활용하여 IP 정보만 있는 Inventory에서도 OS별 그룹을 자동 생성 가능**
**OS 그룹(`solaris`, `aix`, `hpux`, `rhel5`, `rhel7`, `rocky8`, `ubuntu22`)을 자동으로 생성**
**Playbook 실행 시 OS에 맞는 변수(`group_vars/solaris.yml`, `group_vars/aix.yml` 등) 자동 적용**
**운영 환경에서 OS 종류를 자동 감지하여 보안 정책을 쉽게 적용 가능**
- 이전글 Ansible Playbook 실습 - Ansible AWX - K3s 설치 자동화 - 설계
- 다음글 Ansible Playbook 실습 - 취약점 분석 점검 항목 - root 계정 원격 접속 제한 - 설계 1
댓글목록 0
등록된 댓글이 없습니다.
