誰も使っていないアカウントが最も強い権限を持っていた
한국어 원문으로 표시합니다.
목표
계정·역할·권한 자료에서 유효 권한을 펴고, 쓰이지 않는 권한·휴면 계정·직무 분리 위반·권한 상승 경로를 찾아 축소안을 만든 뒤, 적용한 상태로 다시 판정해 위반이 줄었음을 숫자로 보입니다.
왜 중요한가
권한 목록은 시간이 지나면 아무도 설명하지 못하는 상태가 됩니다. 폐쇄망에서는 자료를 밖으로 옮길 수 있는 유일한 통로가 그럴 권한을 가진 계정이라, 이 목록이 곧 반출 경로의 목록입니다. 그래서 감리는 "누가 무엇을 할 수 있는가" 를 묻고, 그 답은 기억이 아니라 자료에서 계산해 내야 합니다. 이 실습에서 어려운 부분은 규칙이 아니라 구조입니다. 역할 상속이 순환하면 소박한 재귀가 멈추지 않고, 권한을 부여할 수 있는 계정은 한 단계만 따라가면 실제 도달 범위를 놓칩니다.
단계
python3로/root/least/data에 여섯 개 자료 파일을 만듭니다. 생성 스크립트를 그대로 쓰세요.- 상속을 편 계정별 유효 권한을
/root/least/effective.json에, 서로를 상속하는 역할 두 개를/root/least/cycle.txt에 적습니다. - 가진 권한 중 관측 기간에 쓰이지 않은 것을
/root/least/unused.csv에account_id,perm으로 적습니다. - 기준일 기준 미접속 90일 이상이거나 퇴직 표시가 있는 계정을
/root/least/dormant.csv에account_id,days_idle,reason으로 적습니다. - 유효 권한에서 직무 분리 규칙을 어긴 쌍을
/root/least/sod.csv에account_id,rule_id,perm_a,perm_b로 적습니다. - 스스로 역할을 더해 도달할 수 있는 추가 권한을
/root/least/escalation.json에 계정별로 적습니다. - 배정마다 회수/유지와 사유를 정해
/root/least/plan.csv에account_id,role,action,reason으로 적습니다. - 축소안을 적용한 배정을
/root/least/after/assignments.csv에, 전후 수를 견준 보고를/root/least/after/report.json에 남깁니다.
참고
- 기준일은
/root/least/data/asof.txt에 있습니다.date로 오늘을 쓰면 같은 자료에서 날마다 다른 답이 나옵니다. - 직무 분리 규칙과 휴면 기준 일수는
/root/least/data/policy.json에 들어 있습니다. 숫자를 코드에 박지 말고 그 파일에서 읽으세요. - 상속을 펼 때는 이미 방문한 역할을 기억하며 내려갑니다. 그러지 않으면
RecursionError가 납니다. - 7단계의 "그 배정이 혼자만 주는 권한" 은 그 배정을 뺐을 때 사라지는 권한입니다. 다른 역할이 같은 권한을 이미 주고 있으면 그 배정이 주는 것은 없습니다.
- 흔한 실수 1: 6단계에서 한 걸음만 따라가는 것. 부여받은 역할이 또 다른 역할을 부여할 수 있습니다.
- 흔한 실수 2: 8단계에서 원래 배정 파일을 덮어쓰는 것. 적용 전 자료가 남아 있어야 전후를 견줄 수 있습니다.
- 표준 문서: NIST SP 800-53 Rev 5, NIST SP 800-171 Rev 3. 이 실습의 규칙 번호(SOD-01 처럼)는 표준의 통제 번호가 아니라 자료 안에서만 쓰는 합성 번호입니다.
판정의 바탕이 될 자료 만들기
python3 로 /root/least/data 에 accounts.csv·roles.json·assignments.csv·usage.csv·policy.json·asof.txt 여섯 개를 만듭니다. 난수를 쓰지 않는 생성 스크립트를 그대로 쓰세요.
폐쇄망에는 내려받을 표본이 없으니 자료부터 직접 만듭니다. 난수를 쓰지 않아야 누가 몇 번을 돌려도 같은 자료가 나오고, 서로의 판정을 대조할 수 있습니다. 채점기는 파일 내용을 표준형으로 바꿔 지문을 대조하므로 자료를 손으로 고치면 뒤 단계가 전부 막힙니다.
상속을 펴서 계정이 실제로 쥔 것 보기
/root/least/effective.json 에 계정별 유효 권한 목록을, /root/least/cycle.txt 에 서로를 상속하는 역할 이름을 한 줄에 하나씩 적으세요.
역할은 다른 역할을 상속하고, 상속은 여러 단계입니다. 이미 방문한 역할을 기억하지 않으면 재귀가 끝나지 않습니다 — 그리고 그 사실 자체가 이 자료에서 찾아야 할 것 하나입니다. 두 역할이 서로를 상속하면 둘의 유효 권한은 같아집니다.
가졌지만 한 번도 쓰지 않은 권한 세기
/root/least/unused.csv 에 첫 줄 account_id,perm 을 두고, 유효 권한 중 usage.csv 에 없는 것을 한 줄에 하나씩 적으세요.
사용 기록은 계정과 권한의 쌍입니다. 유효 권한 집합에서 사용한 권한 집합을 빼면 남는 것이 답입니다. 이 목록은 판정이 아니라 질문지라는 점을 기억하세요 — 분기에 한 번 쓰는 권한은 관측 기간에 안 보입니다.
기준일로 휴면 계정 가르기
/root/least/dormant.csv 에 첫 줄 account_id,days_idle,reason 을 두고, 기준일에서 센 미접속 일수가 policy.json 의 기준 이상이거나 상태가 terminated 인 계정을 적으세요. 사유는 미접속·퇴직·미접속+퇴직 중 하나입니다.
기준일은 asof.txt 에 있습니다. 오늘 날짜를 쓰면 같은 자료에서 어제와 오늘의 답이 달라져 감사 자료로 쓸 수 없습니다. 일수는 기준일에서 마지막 접속일을 뺀 날수이고, 두 사유가 겹치면 둘 다 적습니다.
함께 쥐면 안 되는 권한 쌍 찾기
/root/least/sod.csv 에 첫 줄 account_id,rule_id,perm_a,perm_b 를 두고, policy.json 의 규칙마다 두 권한을 함께 가진 계정을 적으세요.
규칙은 권한 하나가 아니라 쌍에 걸립니다. 유효 권한 집합에 a 와 b 가 모두 있으면 위반입니다. 규칙 번호를 코드에 박지 말고 policy.json 을 돌면서 판정하세요 — 규칙이 늘어도 코드는 그대로여야 합니다.
스스로 늘릴 수 있는 권한까지 따라가기
/root/least/escalation.json 에 계정별로, 지금은 없지만 스스로 역할을 더해 도달할 수 있는 권한 목록을 적으세요. 추가로 얻을 것이 없는 계정은 넣지 않습니다.
권한을 부여할 수 있는 권한을 쥔 계정은 자기에게 역할을 붙일 수 있습니다. 그렇게 붙인 역할이 또 다른 역할을 부여할 수 있다면 한 걸음 더 갑니다. 더 붙일 역할이 없을 때까지 반복한 뒤, 도달한 권한에서 원래 가진 권한을 빼세요.
배정마다 회수할지 둘지 정하기
/root/least/plan.csv 에 첫 줄 account_id,role,action,reason 을 두고 배정 하나마다 한 줄씩 적으세요. action 은 revoke 또는 keep, reason 은 휴면·중복·미사용·사용 중 하나입니다.
판정 순서가 결과를 바꿉니다. 휴면 계정이면 사유를 따질 것 없이 전부 회수합니다. 그 다음, 그 배정이 혼자만 주는 권한이 하나도 없으면 중복이고, 있는데 하나도 쓰이지 않았으면 미사용입니다. 나머지가 유지입니다.
적용한 뒤 다시 판정해 줄었는지 보기
축소안을 적용한 배정을 /root/least/after/assignments.csv 에 남기고, /root/least/after/report.json 에 assignments_before·assignments_after·sod_before·sod_after·unused_before·unused_after·escalation_before·escalation_after·dormant 아홉 개 수를 적으세요.
원래 자료는 그대로 두고 적용 결과를 새 파일에 씁니다. 그래야 전후를 견줄 수 있고, 다시 채점해도 같은 결과가 나옵니다. 보고의 수는 손으로 세지 말고 앞 단계와 같은 함수로 적용 후 배정에서 다시 계산하세요 — 채점기도 같은 계산을 합니다.