소개
Ava가 스튜디오의 오래된 노트북을 교체했습니다. 두 준비된 호스트는 현재 키와 예비 키 외에 그 장치의 키도 계속 허용합니다. 계정과 원래 메모를 보존하면서 오래된 장치 권한만 제거하세요.
이 독립 단원은 “동료에게 접근 권한 부여하기”의 사용자, 공개 키, lookup과 루프 연습을 전제로 합니다. 자체 교육 키와 기존 계정이 준비되어 있으며 이전 VM의 파일이나 연결을 이어받지 않습니다.
오래된 장치 키 하나 제거하기
이 단계에서는 두 스튜디오 호스트에서 Ava의 오래된 장치 키 권한을 취소하고 새 연결이 거부됨을 증명하며 현재 키, 예비 키와 원래 작업을 보존합니다.
이 단원에는 자체 새 환경이 있습니다. Ava는 이미 두 대상에 계정과 작업을 가지고 있습니다. 각 계정은 현재, 예비, 오래된 장치의 교육 키 세 개를 허용합니다. 오래된 권한만 제거합니다. 키를 제거하면 그것을 쓰는 새 인증을 차단하지만 이미 인증된 연결은 종료하지 않습니다. 이 실습은 새 연결을 테스트하며 기존 세션을 종료한다고 주장하지 않습니다.
Controller를 열고 프로젝트 디렉터리로 이동하세요. 실수로 디렉터리를 바꾼 경우에도 다음 명령으로 돌아옵니다.
cd /home/labex/project
준비된 입력과 클라이언트 별칭을 읽으세요.
cat approved-staff.json
cat clients.conf
승인된 계정은 studio_ava입니다. 취소할 키는 training-keys/ava-old.pub이며 training-keys/ava.pub와 training-keys/ava-backup.pub는 계속 허용합니다. .pub로 끝나는 키는 공개 키이고 대응하는 개인 키는 교육 클라이언트에 남습니다. 별칭은 호스트, 사용자와 정확한 키를 선택합니다. -F clients.conf는 신뢰를 고정한 프로젝트 구성을 사용하며 매번 ssh가 새 연결을 만듭니다. 인벤토리, 클라이언트 설정, 호스트 신뢰와 교육 키를 변경하지 마세요.
접근을 바꾸기 전에 정상 동작을 관찰하세요. 작은따옴표 안에서 원격 셸은 세미콜론으로 구분한 id와 cat을 순서대로 실행합니다.
ssh -F clients.conf web1-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava 'id -un; cat work/briefing.txt'
두 신원 모두 studio_ava이지만 Riverside와 Hill 메모는 다릅니다. 예비 키도 확인하세요.
ssh -F clients.conf web1-ava-backup 'id -un'
ssh -F clients.conf web2-ava-backup 'id -un'
이 시점에는 오래된 장치도 여전히 허용됩니다.
ssh -F clients.conf web1-ava-old 'id -un'
ssh -F clients.conf web2-ava-old 'id -un'
추가할 키 목록에서 키를 지우는 것만으로는 대상에서 제거를 요청하지 않습니다. 빈 추가 목록으로 차이를 안전하게 관찰하세요. here-document는 컨트롤러 파일 전체를 씁니다. >는 해당 파일을 교체하며 따옴표로 감싼 YAML은 셸 확장을 막습니다. 끝 구분자는 줄 맨 앞에 단독으로 있어야 합니다. 끝 구분자가 없어 셸이 계속 기다리면 Ctrl+C로 미완료 입력을 취소하고 일반 프롬프트에서 전체 블록을 다시 실행하세요. []는 빈 YAML 목록이므로 루프가 처리할 항목이 없습니다.
cat > additions.yml <<'YAML'
- name: Add listed keys without removing other grants
hosts: all
become: true
gather_facts: false
vars:
keys_to_add: []
tasks:
- name: Add a listed key
ansible.posix.authorized_key:
user: studio_ava
key: "{{ lookup('file', item) }}"
state: present
loop: "{{ keys_to_add }}"
YAML
ansible-playbook additions.yml
두 호스트에서 키 작업이 건너뛰어지고 변경이 없습니다. 가능한 모든 권한을 검사하여 목록에 없는 키를 제거한 것이 아닙니다. 오래된 장치는 여전히 연결할 수 있습니다.
ssh -F clients.conf web1-ava-old 'id -un'
이제 실제 취소를 표현하세요. group_vars/all.yml은 두 인벤토리 호스트에 목록을 제공하고 준비된 승인 파일을 바꾸지 않습니다. 각 객체는 과정 사용자와 컨트롤러 공개 키 경로를 지정합니다. 잘못 작성한 파일 블록은 다시 실행해 해당 컨트롤러 파일을 교체하면 되며 VM 초기화는 필요하지 않습니다.
cat > group_vars/all.yml <<'YAML'
revoked_keys:
- name: studio_ava
key_file: training-keys/ava-old.pub
YAML
배운 키 모듈과 state: absent를 사용하세요. 이 키만 제거하고 계정과 다른 권한은 보존합니다. 루프는 나열된 각 제거를 처리합니다. 이중 중괄호는 현재 항목 값을 해석하고 lookup은 컨트롤러 공개 키를 읽습니다. 컬렉션은 프로젝트용으로 오프라인 설치되어 있습니다. 독점 교체, 홈 디렉터리 삭제, 암호 잠금이나 플랫폼 SSH 서비스 변경을 사용하지 마세요.
cat > revoke.yml <<'YAML'
- name: Revoke only the approved old device keys
hosts: all
become: true
gather_facts: false
tasks:
- name: Remove each listed old public key
ansible.posix.authorized_key:
user: "{{ item.name }}"
key: "{{ lookup('file', item.key_file) }}"
state: absent
loop: "{{ revoked_keys }}"
YAML
문법을 확인하세요. YAML 오류가 나면 지정된 줄을 읽고 전체 블록과 들여쓰기/따옴표를 비교한 후 그 컨트롤러 파일만 다시 작성하세요.
ansible-playbook revoke.yml --syntax-check
계정이 이미 있으므로 지원되는 check mode로 키 제거를 예측할 수 있습니다. --diff는 이 미리 보기에 필요 없는 공개 키 행을 표시합니다. --check를 사용하세요.
ansible-playbook revoke.yml --check
두 호스트 모두 변경을 예측해야 합니다. check mode는 실제 권한을 아직 취소하지 않았습니다. 적용하세요.
ansible-playbook revoke.yml
두 호스트는 연결 불가나 실패한 작업 없이 끝나야 합니다. 다음 두 연결은 Permission denied (publickey)와 종료 상태 255로 실패하는 것이 정상입니다.
ssh -F clients.conf web1-ava-old 'id -un'
ssh -F clients.conf web2-ava-old 'id -un'
시간 초과, 네트워크 연결 거절이나 호스트 키 경고는 취소의 증거가 아닙니다. 서버는 계속 사용 가능하고 허용된 키는 작동해야 합니다. 현재 키와 예비 키로 새 연결을 만들어 두 원본 파일을 읽으세요.
ssh -F clients.conf web1-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web1-ava-backup 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava-backup 'id -un; cat work/briefing.txt'
네 연결 모두 studio_ava로 성공하고 해당 원래 메모를 표시해야 합니다. 바이트, 소유자와 모드 0640을 보존하세요. 홈/작업 디렉터리는 0750, .ssh는 0700, authorized_keys는 0600으로 유지합니다. 파일은 studio_ava와 기본 그룹 소유입니다. 기존 키 모듈은 준비된 이 안전한 권한을 보존합니다.
실제 선언을 반복하고 예측도 실행하세요.
ansible-playbook revoke.yml
ansible-playbook revoke.yml --check
두 요약은 changed=0, unreachable=0, failed=0이어야 합니다. 올바른 취소는 실제 권한을 선택적으로 변경하는 것이며 성공 요약이나 빈 컨트롤러 목록만으로는 충분하지 않습니다. 잘못된 키 경로를 골랐다면 컨트롤러 데이터를 고치고, 배운 state: present로 실수로 제거한 정당한 키를 복원한 다음 정확한 선택적 제거를 다시 적용하세요. 전체 키 파일을 비우거나 모두에게 쓰기 권한을 주어 복구하지 마세요.
요약
추가 목록에서 생략하는 것과 명시적 취소를 구분하고 state absent로 공개 키 권한 하나를 제거했습니다. 실제 새 연결 거부를 확인하면서 현재/예비 로그인과 두 원본 작업 파일을 유지했습니다. 변경하지 않은 선언은 불필요한 변경 없이 수렴했습니다.



