You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
B1-1/
├── setup/ # 프로비저닝 스크립트 모음
│ ├── setup.sh # 원커맨드 진입점 (전체 실행)
│ ├── common_setup.sh # 공통 변수·함수 (require_root, 경로 상수)
│ ├── package_setup.sh # 패키지 설치
│ ├── ssh_setup.sh # SSH 포트 변경·Root 로그인 차단
│ ├── firewall_setup.sh # UFW 방화벽 설정
│ ├── group_setup.sh # 그룹 생성 (agent-common, agent-core)
│ ├── account_setup.sh # 계정 생성 (agent-admin, agent-dev, agent-test)
│ ├── permission_setup.sh # 디렉토리·권한 설정
│ ├── env_setup.sh # 환경변수 등록 (/etc/profile.d/agent-env.sh)
│ ├── app_setup.sh # 바이너리·스크립트 배포
│ └── cron.sh # cron 자동 등록
├── app/
│ ├── agent-app # 실행 바이너리 (B1-1)
│ └── agent-app-leak # 실행 바이너리 (B1-2, 장애 시뮬레이션)
├── monitor.sh # 시스템 관제 스크립트
└── report.sh # 통계 리포트 스크립트
핵심 개념 정리
SSH (Secure Shell)
암호화 기술을 사용하여 원격 컴퓨터에 안전하게 접속하고 명령을 실행하는 네트워크 프로토콜
기존 rsh, telnet, ftp 등 평문 전송 프로토콜의 보안 강화 대체
기본 포트(22)를 비표준 포트로 변경하여 무차별 대입 공격(Brute-force) 감소
Root 직접 로그인 차단으로 권한 상승 공격 방지
UFW (Uncomplicated Firewall)
Linux iptables/nftables를 간편하게 관리하는 방화벽 도구
기본 정책: 인바운드 차단(deny incoming), 아웃바운드 허용(allow outgoing)
허용 포트만 명시적으로 개방하는 화이트리스트 방식
cron
지정된 시간 간격으로 명령을 자동 실행하는 Linux 스케줄러
* * * * * (분 시 일 월 요일) 형식으로 주기 설정
이 과제에서는 monitor.sh를 매분 실행하여 관제 로그 자동 수집
로그 로테이션
로그 파일이 무한히 커지는 것을 방지하는 관리 기법
monitor.log가 10MB 초과 시 .1, .2, ... .10까지 순환 보관
최대 10개 파일 유지, 가장 오래된 파일은 자동 삭제
환경변수와 /etc/profile.d/
/etc/profile.d/*.sh에 등록한 환경변수는 모든 사용자의 로그인 시 자동 적용
개별 사용자 ~/.bashrc와 달리 시스템 전역 설정으로, 계정 간 일관성 보장
수행 내역
1. 기본 보안 및 네트워크 설정
SSH 설정 변경
실행 명령
# 포트 변경: 22 → 20022 (기본 포트 스캔 회피)
sudo sed -i 's/^#\?Port .*/Port 20022/' /etc/ssh/sshd_config
# Root 직접 로그인 차단
sudo sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
# sshd 재시작
sudo systemctl restart sshd
확인 결과
$ grep -E '^(Port|PermitRootLogin)' /etc/ssh/sshd_config
Port 20022
PermitRootLogin no
$ ss -tulnp | grep sshd
tcp LISTEN 0 128 0.0.0.0:20022 0.0.0.0:* users:(("sshd",pid=...))
정리
SSH 포트를 22 → 20022로 변경하여 기본 포트 스캔 공격 감소
Root 직접 로그인 차단, 일반 계정 → sudo 경유 방식 적용
UFW 방화벽 설정
실행 명령
# 기본 정책: 인바운드 차단, 아웃바운드 허용
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 허용 포트 설정
sudo ufw allow 20022/tcp # SSH
sudo ufw allow 15034/tcp # agent-app# 방화벽 활성화
sudo ufw enable
확인 결과
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
20022/tcp ALLOW IN Anywhere
15034/tcp ALLOW IN Anywhere
20022/tcp (v6) ALLOW IN Anywhere (v6)
15034/tcp (v6) ALLOW IN Anywhere (v6)
정리
SSH(20022)와 앱(15034)만 인바운드 허용, 나머지 모든 포트 차단
IPv4 / IPv6 모두 동일 정책 적용
2. 계정/그룹/권한 체계
그룹 생성
sudo groupadd agent-common # 전체 계정 공통 그룹
sudo groupadd agent-core # 핵심 계정 전용 그룹
# 전체 기간 통계
bash report.sh
# 특정 구간 통계
bash report.sh "2026-05-17 14:00:00""2026-05-17 15:00:00"
출력 예시
====== STATISTICS REPORT ======
[CPU]
Average : 3.2%
Maximum : 15.1% at 2026-05-17 14:32:05
Minimum : 0.5% at 2026-05-17 14:01:05
[Memory]
Average : 5.8%
Maximum : 8.2% at 2026-05-17 14:45:05
Minimum : 4.1% at 2026-05-17 14:00:05
[Disk]
Average : 42.0%
Maximum : 42.0% at 2026-05-17 14:00:05
Minimum : 42.0% at 2026-05-17 14:00:05
[Samples]
Data Points: 60 samples
[잘못된 사용] - Deadlock 발생
Thread-1: lock(A) → lock(B)
Thread-2: lock(B) → lock(A) ← 순서가 반대
[올바른 사용] - Lock Ordering
Thread-1: lock(A) → lock(B)
Thread-2: lock(A) → lock(B) ← 순서 통일
[Semaphore 활용] - 동시 접근 허용
Semaphore(2)로 A, B를 하나의 자원 그룹으로 관리
→ 두 자원을 한 번에 획득하거나, 둘 다 실패
→ 점유 대기(Hold and Wait) 제거
Deadlock 예방/회피 전략
전략
방법
트레이드오프
순서 강제 (Lock Ordering)
모든 스레드가 자원을 동일한 순서로 요청
순환 대기 제거, 설계 복잡도 증가
타임아웃 (Try-Lock with Timeout)
일정 시간 내 자원 획득 실패 시 보유 자원 해제 후 재시도
점유 대기 제거, Livelock 가능성
단일 스레드 (Single Thread)
멀티스레드 비활성화 (MULTI_THREAD_ENABLE=false)
Deadlock 원천 차단, 동시성/성능 포기
자원 한 번에 요청
필요한 자원을 모두 한꺼번에 요청
점유 대기 제거, 자원 활용률 저하
스케줄링 알고리즘 추론 (보너스)
실행 조건: MULTI_THREAD_ENABLE=false, MEMORY_LIMIT=512, CPU_MAX_OCCUPY=50
정상 실행(Healthy System Monitoring) 상태에서 Worker 스레드 로그를 수집하여 분석