# RADIUS·TACACS·메일·시스템 로그 실습 시연 이 문서는 2026-09-09 현재 PC의 기존 AAA 실습 환경과 장비 소스를 확인해서 작성했다. 전체 메뉴 안내는 `DEMO_RUNBOOK_20260909.md`를 참고한다. ## 1. 지금 준비된 것과 이번에 추가한 것 | 항목 | 주소 | 현재 확인 범위 | |---|---|---| | 장비 관리 UI | http://192.168.0.223/ | 관리 포트80 기준 | | 기존 RADIUS 컨테이너 | 192.168.0.100:1645/UDP → 컨테이너1812 | Docker 실행 상태·포트 매핑 확인 | | 기존 TACACS+ 컨테이너 | 192.168.0.100:49/TCP | Docker 실행 상태·포트 매핑 확인 | | 새 Mailpit 수신 서버 | PC 1025/TCP, 수신함 http://127.0.0.1:8025/ | 구성 파일 추가, 이번 작업에서 실행·장비 수신 시험은 하지 않음 | | 새 Syslog 수신 서버 | PC 1514/UDP 또는 TCP → 컨테이너514 | 구성 파일 추가, 이번 작업에서 실행·장비 수신 시험은 하지 않음 | RADIUS와 TACACS는 이미 **별도 이미지·별도 컨테이너**다. 두 서버를 바꾸어 켤 필요 없이 함께 실행하고, 장비에서 인증 방식을 선택해 시연하면 된다. 메일·Syslog까지 총 네 컨테이너 구성이다. **동시 실행과 동시 인증의 구분** - 웹 로그인: `primary_method` 하나를 사용한다. RADIUS → TACACS 순서로 기본 방식을 바꿔서 시험한다. 한 번의 웹 로그인에서 두 서버를 모두 통과하는 구조가 아니다. - Reverse SSH/Telnet: 포트의 동작 설정별로 RADIUS 또는 TACACS를 지정할 수 있다. 서로 다른 시험 포트/Listen Port로 나누면 나란히 시험할 수 있다. - 장비 웹의 외부 인증은 Local fallback을 유지한다. 외부 인증 거부 뒤에도 같은 이름·암호의 로컬 계정이 있으면 로그인할 수 있다. 따라서 `labadmin`을 장비 로컬 사용자에 중복 등록하지 않는다. - 포트 Reverse 외부 인증 경로는 실패 시 로컬 암호로 우회하지 않는다. - 현재 구현은 인증 결과와 장비에 설정한 기본 역할을 사용한다. RADIUS 속성별 역할 매핑, TACACS 명령별 허가·Accounting, RADIUS Challenge/EAP/MFA 시연으로 확대해 설명하지 않는다. - 시리얼로 연결한 상대 장비의 자체 로그인은 또 다른 인증이다. 통합콘솔의 Reverse 인증 성공 뒤 상대 장비가 아이디를 요구하는 것은 이중 오류가 아니라 별도 로그인일 수 있다. ## 2. PC 서버 준비: 복사해서 실행할 명령 ### 2-1. 주소·컨테이너 확인 Docker Desktop을 Linux 컨테이너 모드로 실행하고 PowerShell을 연다. ```powershell Set-Location C:\Users\temp\Desktop\tera_Clone_Demo Get-NetIPAddress -AddressFamily IPv4 docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" ``` 아래 예시는 PC LAN 주소가 `192.168.0.100`일 때다. 다른 주소면 모든 PC 서버 주소를 그 값으로 바꾼다. **장비의 서버 주소에 localhost, 127.0.0.1, Docker 내부 서비스 이름을 입력하면 안 된다.** ### 2-2. RADIUS·TACACS 현재 두 컨테이너가 정상 실행 중이면 시작 명령은 생략한다. 중지됐거나 새로 구성할 때: ```powershell .\aaa-lab\start.ps1 -BindAddress 192.168.0.100 docker compose -f .\aaa-lab\docker-compose.yml ps ``` 실행 파일은 각각 `aaa-lab/radius/Dockerfile`, `aaa-lab/tacacs/Dockerfile`, 묶음 구성은 `aaa-lab/docker-compose.yml`이다. 서버 계정은 각각 `radius/authorize`, `tacacs/tac_plus.conf`에 있다. 이 구성은 파일을 이미지에 복사하므로 계정을 바꿨다면 다시 빌드해야 반영된다. 기존 실습 전용 값: | 입력 | 값 | |---|---| | 사용자 이름 | `labadmin` | | 암호 | `LabAdminPassword-2026` | | 서버 공유 Secret | `LabAaaSharedSecret-2026` | 이는 공개된 폐쇄망 실습 값이다. 실제 운영 자격증명이 아니다. Shared Secret은 사용자 암호와 다른 값이며, 장비와 서버가 동일하게 설정해야 한다. ### 2-3. 메일·Syslog 수신기 다음 명령은 새 이미지 다운로드/빌드와 컨테이너 시작을 수행한다. 인터넷이 없는 시연장에서는 미리 빌드해 둔다. ```powershell $env:DEMO_BIND_ADDRESS = '192.168.0.100' docker compose -f .\demo-services\compose.yaml config --quiet docker compose -f .\demo-services\compose.yaml up -d --build docker compose -f .\demo-services\compose.yaml ps ``` 두 서비스가 실행된 뒤 PC에서 `http://127.0.0.1:8025/`를 열면 시험 메일함이 보인다. Mailpit의 메일함은 이 PC에만 공개했고 SMTP1025는 장비가 접근하는 PC LAN 주소에 공개했다. ### 2-4. 필요한 방화벽만 확인 필요 경로는 **장비192.168.0.223 → PC192.168.0.100**의 UDP1645, TCP49, TCP1025, UDP/TCP1514다. 브라우저용8025는 PC 내부에서만 사용한다. 차단될 경우 관리자 PowerShell에서 해당 장비만 허용하는 규칙을 추가할 수 있다. 다음은 규칙이 아직 없을 때의 예시다. ```powershell New-NetFirewallRule -DisplayName 'TERA Demo TCP' -Direction Inbound -Action Allow -Protocol TCP -LocalAddress 192.168.0.100 -LocalPort 49,1025,1514 -RemoteAddress 192.168.0.223 -Profile Any New-NetFirewallRule -DisplayName 'TERA Demo UDP' -Direction Inbound -Action Allow -Protocol UDP -LocalAddress 192.168.0.100 -LocalPort 1645,1514 -RemoteAddress 192.168.0.223 -Profile Any ``` 이 PC에서는 과거 Docker의 명시적 차단 규칙이 허용 규칙보다 우선했던 기록이 있다. 추가 후에도 안 되면 기존 차단 규칙을 확인한다. 방화벽 전체를 끄지 않는다. 기존 `aaa-lab/fix-radius-firewall.ps1`은 과거 특정 규칙을 수정하는 스크립트이므로 현재 규칙·주소를 확인한 뒤 사용한다. `Test-NetConnection -Port`는 TCP 시험이라 RADIUS UDP 정상 여부를 판정할 수 없다. ## 3. RADIUS 웹 로그인 시연 ### 화면 준비 - 관리자 브라우저: 현재 관리자 로그인 유지. - 시험 브라우저: 별도 프로필/시크릿 창. 동일 시크릿 세션의 여러 창은 쿠키를 공유할 수 있으므로 각각 독립 세션인지 확인. - PowerShell: 아래 서버 로그 표시. ```powershell docker compose -f .\aaa-lab\docker-compose.yml logs --since 1m --follow radius ``` ### 장비 입력값 관리자 운영 → RADIUS: | 항목 | 입력 | |---|---| | 사용 | 켬 | | 서버 | 192.168.0.100 | | 포트 | **1645** | | 공유 Secret | LabAaaSharedSecret-2026 | | 타임아웃 | 5초 | | 기본 역할 | 포트 운영자 | 적용 후 재조회한다. 이 실습은 호스트1645를 컨테이너1812로 연결했으므로 장비에1812를 입력하면 다른 경로를 시험하게 된다. ### 시연 A: 성공 1. 장비 로컬 사용자에 `labadmin`이 중복으로 없는지 확인한다. 2. 시험 브라우저에서 `http://192.168.0.223/`에 접속한다. 3. `labadmin` / `LabAdminPassword-2026`과 올바른 CAPTCHA로 로그인한다. 4. 장비 화면의 로그인 성공·포트 운영자 메뉴를 보여 준다. 5. 같은 시각의 RADIUS 로그에서 사용자 요청과 `Access-Accept`를 보여 준다. **합격:** 장비 로그인 성공 + 실제 서버의 해당 요청 승인. 화면에 들어갔다는 사실만으로 합격하지 않는다. ### 시연 B: 잘못된 암호 거부 1. 시험 계정 로그아웃 후 새 CAPTCHA를 입력한다. 2. 암호만 `Wrong-Lab-Password`로 바꿔 1회 로그인한다. 3. 장비 로그인 거부와 서버 `Access-Reject`를 확인한다. 4. CAPTCHA 오류로 거부되면 외부 서버 요청 자체가 없을 수 있으므로 암호 거부 시험과 구분한다. ### 시연 C: 서버 중단과 Local fallback 다른 사람이 이 시험 서버를 사용하지 않는 시간에만 한다. 기존 세션은 서버를 끈다고 즉시 로그아웃되지 않으므로 **새 로그인**으로 검사한다. ```powershell docker compose -f .\aaa-lab\docker-compose.yml stop radius ``` - 외부 전용 `labadmin`의 새 로그인은 실패해야 한다. - 실제 로컬 관리자 계정의 새 로그인은 fallback으로 가능해야 한다. 관리자 이름·암호는 현재 장비 값을 사용한다. - 기존 관리자 세션은 유지하고, 임계 횟수에 도달할 정도로 외부 계정 실패를 반복하지 않는다. 끝나면 즉시 복원한다. ```powershell docker compose -f .\aaa-lab\docker-compose.yml start radius ``` 복원 후 새 CAPTCHA로 외부 로그인 성공을 다시 확인한다. 타임아웃과 계정 잠금 상태를 구분한다. ## 4. TACACS+ 웹 로그인 시연 두 서버는 계속 함께 실행한다. 관리자 운영 → TACACS에서 다음을 적용한다. | 항목 | 입력 | |---|---| | 사용 | 켬 | | 서버 | 192.168.0.100 | | 포트 | **49** | | 공유 Secret | LabAaaSharedSecret-2026 | | 타임아웃 | 5초 | | 기본 역할 | 포트 운영자 | ```powershell docker compose -f .\aaa-lab\docker-compose.yml logs --since 1m --follow tacacs ``` 1. 새 시험 세션에서 동일 실습 계정과 올바른 CAPTCHA로 로그인한다. 2. TACACS 서버 로그의 같은 시각 인증 성공 기록과 장비 로그인 성공을 함께 확인한다. 서버 로그 문구는 버전마다 달라 RADIUS의 `Access-Accept`라는 문구를 찾는 것이 아니다. 3. 로그아웃 후 틀린 암호 1회 → 서버의 인증 거부 + 장비 로그인 거부를 확인한다. 4. 필요 시 `docker compose -f .\aaa-lab\docker-compose.yml stop tacacs`로 중단 → 외부 계정 새 로그인 실패 → 로컬 관리자 로그인 가능을 확인한다. 5. `docker compose -f .\aaa-lab\docker-compose.yml start tacacs`로 복원하고 외부 로그인을 재확인한다. **주의:** TACACS를 기본으로 적용하면 웹 로그인은 TACACS를 사용한다. RADIUS 화면의 ‘사용’ 표시도 기본 방식 여부를 반영하므로 꺼져 보일 수 있다. 이것만 보고 RADIUS 컨테이너가 종료됐다고 판단하지 않는다. 두 서버 목록을 보존한 채 기본 방식만 바뀌는 흐름이다. ## 5. 두 인증 방식을 한 화면에서 나란히 시연하기 웹 로그인은 위처럼 순서대로 보여 주고, 동시 비교는 Reverse 접속으로 한다. 1. RADIUS를 먼저 사용·적용하고 TACACS도 사용·적용해 두 서버 정보를 저장한다. 마지막 기본 방식은 TACACS여도 된다. 이후 RADIUS를 명시적으로 사용 해제·저장하지 않는다. 2. 실제 연결된 시험 포트 A의 동작 설정1을 Reverse SSH, 인증 RADIUS로 지정한다. 3. 다른 시험 포트 B의 동작 설정1을 Reverse SSH, 인증 TACACS로 지정한다. 4. 서로 다른 미사용 Listen Port를 선택한다. 예시는 A=22001, B=22002이며 실제 사용 가능 여부를 확인한 후 적용한다. 웹80은 변경하지 않는다. 5. 데이터 포트는 상대와 동일한9600/8/N/1로 맞춘다. 6. PowerShell 창 두 개에서 각각 접속한다. 암호는 프롬프트에서 입력한다. ```powershell ssh -p 22001 labadmin@192.168.0.223 ``` ```powershell ssh -p 22002 labadmin@192.168.0.223 ``` 7. 최초 SSH 호스트 키 확인 시 대상 장비의 키인지 확인한다. 장비 변경 뒤 키 불일치가 나면 검증 없이 호스트 키 검사를 끄지 않는다. 8. RADIUS 창 접속 시 radius 로그, TACACS 창 접속 시 tacacs 로그에 인증 기록이 생기는지 보여 준다. 9. 각각 상대 장비의 무해한 조회 명령을 실행하고 실제 응답을 확인한다. 10. 잘못된 암호는 접속을 거부해야 한다. 인증 성공 후 응답이 없는 경우는 시리얼 배선·설정·IRQ 문제로 따로 조사한다. **합격:** 각 경로에서 의도한 외부 서버 승인 → Reverse 세션 생성 → 실제 상대 응답. 상대 장비가 한 대뿐이면 순서대로 시험하고 ‘동시 양방향 검증’이라고 설명하지 않는다. TACACS 서버 설정에 `priv-lvl=15`가 있어도 현재 장비가 그 값을 사용해 관리 권한을 부여하는 것은 아니다. 장비의 외부 인증 기본 역할을 기준으로 설명한다. 브라우저 포트 디버그만으로 Reverse 인증 방식 검증을 대신하지 않는다. ## 6. 메일 알림: 실제 수신함까지 보여 주기 ### 장비 입력값 기타 설정 → 알림 → 메일 설정에서 다음을 저장한다. | 항목 | 입력 | |---|---| | 메일 사용 | 켬 | | SMTP 서버 | 192.168.0.100 | | SMTP 포트 | **1025** | | STARTTLS | 끔 | | SMTP 인증 | 끔 | | 발신자 | tera@example.test | | 수신자 | demo@example.test | | 참조 | 비워 둠 | | 제목 | TERA 시연 알림 | | 본문 | 장비 알림 시험: {{message}} | Mailpit은 이 시험망에서 메일을 받아 PC 웹 화면에 보여 주는 수신기다. 주소의 실제 사서함이나 Gmail 계정이 필요하지 않으며 외부 수신함으로 자동 배달하지 않는다. 기본 SMTP는 인증·암호화 없이1025를 사용한다. [Mailpit SMTP 공식 문서](https://mailpit.axllent.org/docs/configuration/smtp/) ### 시연 A: 테스트 발송 1. PC에서 `http://127.0.0.1:8025/`를 연다. 2. 장비에서 설정을 적용하고 **테스트 발송**을 누른다. 3. 새 메일을 열어 수신 시각, 발신자, 수신자, 제목, 본문을 보여 준다. 4. 예전 메일을 성공으로 착각하지 않도록 현재 시각과 비교한다. **합격:** 버튼 처리 성공 + Mailpit에 새 메일 도착. 이것은 SMTP 발송 경로 시험이며 자동 이벤트 알림 시험은 다음 단계다. ### 시연 B: 실제 이벤트에 의한 자동 메일 다음 중 한 가지를 먼저 리허설한다. **방법 1 — 시리얼 수신 키워드(일반 시연 권장)** 1. 시험 포트 고급 설정에 `DEMO_ALARM_0909`를 저장한다. 2. 기타 설정 → 알림 → 시리얼 이벤트에서 같은 채널을 선택한다. 3. 수신 키워드 감지와 메일 전달을 켜서 적용한다. 4. 상대 장비에서 `DEMO_ALARM_0909`가 **장비 RX로 들어오도록** 전송한다. 터미널 TX로 보내기만 해서는 수신 조건을 입증하지 못한다. 에코 상대라면 돌아온 RX를 확인한다. 5. 포트 로그의 수신 문자열과 이벤트, Mailpit의 새 메일을 같은 시각으로 대조한다. **방법 2 — 로그인 실패 임계값(시스템 이벤트 연계)** 1. 시스템 이벤트에서 로그인 실패 임계값 알림과 메일 전달을 켠다. 2. 장비의 현재 로그인 보호 횟수·감지 시간을 확인한다. 값을 모르면 임의로 3회라고 가정하지 않는다. 3. 관리자와 다른 전용 실패 시험 이름으로 올바른 CAPTCHA + 틀린 암호를 설정 임계 횟수만큼 시도한다. 4. 임시 잠금 발생 기록과 새 메일을 확인한다. 실제 관리자 계정으로 시험하지 않는다. 5. 해당 시험 계정의 잠금 해제 시간을 기록하고 이후 정상 인증 시연에는 사용하지 않는다. 정상 로그인이나 설정 변경이 모든 경우 메일로 발송되는 것은 아니다. 알림 규칙에 연결된 이벤트를 만들어야 한다. ### 실제 회사 메일로 전환할 때 회사 SMTP 서버가 제공하는 호스트·포트·인증·발신 허용 조건을 입력하고 외부 사서함에서 도착을 확인한다. 현재 발송 코드는 평문 연결 후 선택적으로 STARTTLS와 사용자/암호 인증을 한다. **465의 암묵적 TLS나 OAuth 전용 서버를 지원한다고 가정하지 않는다.** Mailpit 성공만으로 회사 메일 서버 인증까지 검증된 것은 아니다. ## 7. 시스템 로그: 사건을 만들고 찾아내는 시연 ### 7-1. 먼저 기록 설정 기타 설정 → 시스템 로그 → 로그 이벤트에서 로컬 시스템·설정 변경·운영 기록을 켜고 적용한다. 시작 시각을 기록한다. 장비와 PC 시각을 맞춰 놓는다. ### 7-2. 세 가지 사건 생성 | 사건 | 실행 | 확인할 내용 | |---|---|---| | 인증 성공·실패 | 별도 시험 계정 정상 로그인 후 로그아웃, 틀린 암호로1회 시도 | 사용자, 시각, `auth.login`, succeeded/authentication_failed 등 결과 | | 설정 변경 | 시험 포트 별칭을 `DEMO_LOG_0909`로 변경·적용 | 설정 변경 분류, 작업자, 포트/대상, 처리 결과 | | 포트 운영 | 시험 포트 접속·무해한 문자열 송수신·해제 | 포트 운영/포트 로그의 채널·방향·원문 | 로그 메뉴 → 시스템 로그에서 시작 시각 이후를 검색한다. 종류 필터를 시스템/설정 변경/운영에 맞게 바꾼다. 별칭 문자열이 감사 메시지에 반드시 포함되는 것은 아니므로 안 나오면 사용자·대상 포트·시각으로 찾는다. RX/TX 원문은 포트 로그에서 확인한다. ### 7-3. 필터·다운로드·권한 1. 사용자 또는 시험 시각으로 검색하고 기대한 성공·실패 두 기록을 보여 준다. 2. 페이지 크기와 이전/다음 이동을 보여 준다. 3. 같은 검색 조건으로 CSV/JSON/JSONL을 내려받아 시각·행 내용이 일치하는지 확인한다. 내보내기 상한 때문에 전체 이력과 건수가 다를 수 있다. 4. 포트 운영자 계정으로 시스템 로그 접근이 거부되는지 확인한다. 허용 포트의 포트 로그 접근은 가능해야 한다. 5. 재부팅 후 시험 시각의 기록을 다시 찾아 보관 여부를 확인한다. **설명 문장:** “메뉴를 보여 주는 데서 끝내지 않고, 방금 만든 성공·실패·설정 변경이 누가 언제 무엇을 했는지 기록되는지 확인합니다.” ## 8. 원격 Syslog: 장비 밖에 저장되는 것 확인 ### 수신 화면 준비 ```powershell docker compose -f .\demo-services\compose.yaml exec syslog tail -n 30 -F /var/log/tera/remote.log ``` 이 창을 시연 화면 옆에 둔다. `docker compose logs syslog`는 데몬 시작 오류 확인용이며 수신 메시지는 위 파일에서 확인한다. ### 장비 설정 기타 설정 → 시스템 로그 → 로그 서버: | 항목 | 입력 | |---|---| | 원격 사용 | 켬 | | 로그 서버 | **192.168.0.100:1514** | | 프로토콜 | 우선 TCP | | 원격 전송할 로그 | 시스템·설정 변경·운영·상태 중 시험 항목 켬 | 1. 적용 후 **새로운** 실패 로그인1회 또는 별칭 변경을 수행한다. 과거 이력이 자동 재전송된다고 가정하지 않는다. 2. 장비 로컬 기록과 PC 수신 파일에 같은 시각·사용자·대상 사건이 있는지 비교한다. 3. 장비의 전송 상태 새로고침에서 최근 상태·시도 횟수·오류를 확인한다. 4. UDP도 시연하려면 프로토콜을 UDP로 변경·적용하고 새 사건을 다시 만든다. 동일1514로 받는다. **합격:** 실제 수신 파일에 해당 사건이 기록됨. 특히 UDP의 ‘전송 완료’는 수신 증거가 아니다. Docker NAT로 `from=`이 내부 주소로 보일 수 있으므로 메시지 내용·사용자·시각도 대조한다. ### 선택: 실패·복구 시연 TCP 모드에서 수신기를 중단한다. ```powershell docker compose -f .\demo-services\compose.yaml stop syslog ``` 새 시험 사건을 만들고 전송 실패/재시도 상태를 확인한다. 전송 처리 시간에 따라 즉시 바뀌지 않을 수 있다. 다시 시작한다. ```powershell docker compose -f .\demo-services\compose.yaml start syslog ``` 새 사건의 수신을 확인한다. 중단 중 사건까지 모두 복구됐다고 설명하려면 해당 사건도 파일에서 하나씩 확인한다. 무제한 재전송·유실 없음은 보장하지 않는다. 수신 기록 파일 보관: ```powershell docker compose -f .\demo-services\compose.yaml cp syslog:/var/log/tera/remote.log .\demo-services\received-syslog.log ``` ## 9. 실패했을 때 확인 순서 | 증상 | 우선 확인 | |---|---| | RADIUS 서버에 요청이 없음 | PC주소, UDP1645 매핑·방화벽, 웹 기본 인증 방식, CAPTCHA에서 먼저 거부됐는지 | | RADIUS 요청은 있으나 응답 없음 | Shared Secret, 클라이언트 허용, Message-Authenticator 정책. 현재 클라이언트는 PAP이며 Challenge 미지원 | | Access-Reject | 실제 서버 계정·암호, 로컬 계정 암호와 혼동 여부 | | 서버가 승인했는데 웹 실패 | 장비 로그·응답 검증·세션 처리 확인. 서버 승인만으로 웹까지 합격하지 않음 | | TACACS 로그 없음 | TCP49, 기본 방식, 서버 실행, 방화벽 | | 외부 서버를 꺼도 로그인됨 | 기존 세션인지, 같은 이름의 로컬 계정으로 fallback 됐는지 | | 포트 인증은 성공하나 RX 없음 | 상대 로그인·9600·배선·실제 응답·현재 IRQ95 상태 | | 메일 테스트 실패 | SMTP1025와 웹8025 혼동, STARTTLS/인증 체크, 방화벽 | | 테스트 메일만 오고 자동 메일 안 옴 | 해당 규칙 활성·메일 전달 선택, RX 키워드 또는 실제 임계 조건 충족 | | Syslog 전송 완료인데 수신 없음 | UDP 결과 의미, 1514포트, 선택 분류, 사건이 설정 이후 생성됐는지 | | 시스템 로그에서 데이터 원문 안 보임 | 포트 로그를 선택했는지, 해당 포트 RX/TX 기록 옵션 | 기존 RADIUS 구성은 Docker NAT 실습용 catch-all client와 Message-Authenticator 미요구 설정이다. 현행 장비 클라이언트의 호환 시험용이며 운영망 보안 구성을 충족한다고 소개하지 않는다. 운영 서버가 Message-Authenticator를 필수로 요구하면 클라이언트 개선이 필요할 수 있다. ## 10. 시연 순서·종료 **권장 진행:** 네 서버 준비 → RADIUS 성공/실패 → TACACS 성공/실패 → 두 Reverse 접속 비교 → Mailpit 테스트 수신 → 키워드 자동 메일 → 로그 검색·내보내기 → 원격 Syslog 수신 → 설정 원복. - 서버 중단·복구는 기본 시연이 성공한 뒤 선택해서 한다. - 장비의 외부 기본 인증·기본 역할·포트 인증·메일·로그 목적지·알림 규칙을 시연 전 값으로 복원한다. 무조건 Local로 바꾸는 것이 아니라 기존 상태를 기준으로 한다. - 수신 증거를 먼저 보관한다. 아래 stop은 컨테이너를 중지하며 볼륨 데이터를 삭제하지 않는다. ```powershell docker compose -f .\demo-services\compose.yaml stop ``` AAA도 종료하려면 다른 사용자가 없는지 확인한 뒤: ```powershell docker compose -f .\aaa-lab\docker-compose.yml stop ``` 이번 시연용으로 만든 방화벽 규칙만 제거하려면 관리자 PowerShell에서: ```powershell Get-NetFirewallRule -DisplayName 'TERA Demo TCP','TERA Demo UDP' | Remove-NetFirewallRule ``` ### 이전 문서·스크립트와의 차이 `aaa-lab/README.md`와 예전 원격 시험 스크립트에는 `:8083` 주소와 CAPTCHA 없이 로그인하는 흐름이 남아 있다. 이번 시연은 **HTTP80 + 실제 CAPTCHA 수동 로그인** 기준이며, 그 스크립트를 그대로 실행하지 않는다. 이 PC에 실행 중인 인증 컨테이너가 있다는 사실은 현재 교체 장비의 인증 성공을 이번에 재검증했다는 뜻이 아니다. ### 근거 - 로컬: `aaa-lab/docker-compose.yml`, `radius/authorize`, `radius/clients.conf`, `tacacs/tac_plus.conf` 및 실제 Docker 포트 조회. - 구현: `backend/internal/externalauth/client.go`, `backend/internal/adapters/mock/store.go`, `backend/internal/alarmdelivery/transport.go`, `frontend/web/static/js/integration.js`. - [FreeRADIUS 구성 파일](https://wiki.freeradius.org/config/Configuration-files) - [현재 실습 TACACS 구현의 설정 문법](https://github.com/facebook/tac_plus/blob/main/tacacs-F4.0.4.28/tac_plus.conf.5.in) - [Mailpit Docker 구성](https://mailpit.axllent.org/docs/install/docker/) - [Mailpit SMTP 기본 동작](https://mailpit.axllent.org/docs/configuration/smtp/) - [rsyslog UDP 입력](https://docs.rsyslog.com/doc/configuration/modules/imudp.html), [TCP 입력](https://docs.rsyslog.com/doc/configuration/modules/imtcp.html)