파일 하나를 읽으려고 붙인 권한이 어느새 버킷 전체 삭제까지 허용하고 있으면, 애플리케이션 오류도 보안 사고가 될 수 있습니다. IAM 하드닝은 허용 목록을 짧게 만드는 데서 끝나지 않습니다. 누가 역할을 맡을 수 있는지와, 그 역할로 무엇을 할 수 있는지 를 함께 확인해야 합니다. 기존 AWS 시리즈 에서 서비스별 역할을 정리한 데 이어, 이번에는 정상 업무를 유지하면서 접근 범위를 줄이는 방법을 살펴봅니다. IAM 역할과 S3 객체 이름을 알고 있다는 전제로, reports/ 아래 파일을 읽는 가상 업무를 살펴보겠습니다. 두 정책은 다른 질문을 받습니다 역할의 신뢰 정책은 어떤 주체가 그 역할을 맡을 수 있는지 정합니다. 역할에 붙은 권한 정책은 역할 세션으로 어떤 API 작업과 리소스에 접근할 수 있는지 정합니다. S3를 읽도록 권한을 붙였다고 누구나 그 역할을 맡을 수 있는 것은 아닙니다. 반대로 역할을 맡을 수 있다고 S3 읽기가 자동 허용되는 것도 아닙니다. 역할 신뢰 정책 관리 그림은 검토 순서를 나타냅니다. 실제 AWS 평가 과정에는 리소스 정책, 세션 정책, 권한 경계, 조직 정책 등이 더 들어갈 수 있습니다. 이 글의 작은 예제를 전체 IAM 엔진으로 확대해서 읽지 않습니다. 한 경로만 읽는 권한 정책 다음은 가상 S3 버킷에 대한 자격 증명 기반 권한 정책 입니다. 역할 신뢰 정책이나 버킷 정책은 포함하지 않았습니다. { "Version": "2012-10-17", "Statement": [ { "Sid": "ListReportNames", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::amzn-s3-demo-hardening", "Condition": {"StringLike": {"s3:prefix": ["reports/*"]}} }, { "Sid": "ReadReportObjects", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-hardening/reports/*" } ] } ListBucket 은 버킷의 객체 이름 목록을 조회하는 작업이라 버킷 ARN을 사용합니다. GetObject 는 객체 내용 읽기이므로 객체 경로가 붙은 ARN을 사용합니다. 파일 이름 목록과 파일 내용은 같은 권한이 아닙니다. S3 자격 증명 기반 정책 예제에서는 요청의 prefix가 reports/ 아래일 때만 목록을 허용하려고 reports/* 를 적었습니다. 콘솔이나 다른 도구는 빈 prefix로 목록을 먼저 요청할 수 있습니다. 그 요청이 거부된다고 바로 버킷 전체 목록 권한을 추가하기보다, 사용하는 클라이언트의 실제 호출을 확인합니다. 버전 객체 읽기나 KMS 복호화도 이 정책만으로 제공되지 않습니다. Allow가 있는데 왜 거부될까요? 적용되는 정책에 명시적인 Deny 가 있으면 해당 Allow 보다 우선합니다. 권한 경계는 권한을 새로 주는 정책이 아니라, 자격 증명 기반 정책이 부여할 수 있는 최대 범위를 제한합니다. 다만 리소스 정책이 누구에게 권한을 주는지에 따라 평가의 세부 규칙이 달라집니다. 모든 경우를 단순 교집합 하나로 설명하지 않습니다. IAM 정책 평가 실무 검토용 질문은 세 가지로 정리할 수 있습니다. 이 호출자는 예상한 역할인가요? 요청한 작업과 리소스가 필요한 범위 안인가요? 이 역할 외의 정책이 더 넓은 허용이나 거부를 만들고 있나요? 범위를 줄일 때 확인할 것 업무에서 실제 호출하는 작업과 리소스를 분리해 적습니다. 관측 기간에 호출이 없었다는 이유만으로 비상 복구 작업까지 불필요하다고 단정하지 않습니다. 테스트 역할에 정책을 붙여 정상 경로와 금지 경로를 함께 검사합니다. reports/a.json 읽기, 다른 경로 읽기, 객체 삭제를 서로 다른 시험으로 다룹니다. 승인된 다른 역할로 정책을 복구할 수 있는지 확인하고 적용 대상을 넓힙니다. 정책 오류로 조회가 끊겼다면 수정한 정책 버전이나 연결을 이전 검토 상태로 되돌립니다. 오류 메시지가 보인다는 이유만으로 s3:* 와 Resource: "*" 를 붙이면 무엇이 필요한지 확인할 근거가 사라집니다. 로컬 검증: JSON을 파싱하고 버킷/객체 ARN 구분, 두 작업, prefix 조건을 검사했습니다. 객체 범위를 버킷 전체로 넓힌 반례와 DeleteObject 를 추가한 반례는 학습용 기준을 통과하지 못했습니다. 이는 문자열과 구조 검사입니다. AWS IAM Policy Simulator, Access Analyzer, 실제 S3 요청은 실행하지 않았습니다. 자주 하는 오해 “읽기 전용이니 민감하지 않다”는 판단도 조심해야 합니다. 읽을 수 있는 보고서 안에 고객 정보가 있다면 쓰기 권한이 없어도 유출이 가능합니다. 최소 권한은 작업 종류뿐 아니라 데이터 범위까지 좁히는 일입니다. 확인 문제 신뢰 정책에 S3 읽기를 적으면 역할의 작업 권한이 되나요? 버킷 ARN과 객체 ARN을 나누는 이유는 무엇인가요? 새 요구사항이 reports/monthly/ 읽기뿐이라면 어디를 더 좁힐까요? 답과 해설 아닙니다. 역할 진입과 역할의 작업 권한은 별도 정책입니다. 작업이 대상으로 삼는 리소스 종류가 다르기 때문입니다. 목록 prefix와 객체 ARN을 함께 좁힙니다. 다른 정책이 더 넓은 접근을 허용하는지도 확인합니다. 복습과 다음 목표 오늘은 두 Statement가 받는 요청을 각각 써 보세요. 내일은 금지 경로 하나를 추가해 왜 거부돼야 하는지 설명해 보세요. 일주일 뒤에는 IAM 허용과 네트워크 도달 가능성을 함께 구분해 보세요. 확인일: 2026-10-04, 한국 시간 . IAM 정책 언어 2012-10-17 , S3 작업을 기준으로 작성했습니다. 예제 이름은 가상이며 그대로 운영에 적용한 정책이 아닙니다.
새로운 일을 시작하며 최근까지 FindClover 를 비롯해 여러 게임 프로젝트를 진행하면서 게임 개발에 많은 시간을 투자해 왔다. 특히 FindClover는 지금도 계속 개발하고 있는 프로젝트인 만큼, 앞으로도 새로운 기능을 추가하고 부족한 부분을 개선하면서 완성도를 높여가고 싶었다. 하지만 앞으로는 지금처럼 게임 개발에만 많은 시간을 투자하기는 어려울 것 같다. 최근 알체라 라는 AI 기업에서 새로운 일을 시작하게 되었기 때문이다. https://www.alchera.ai/?utm_source=google&utm_medium=organic 알체라는 AI 모델 개발에 필요한 학습용 데이터를 수집하고, 정제하고, 가공하고, 검수하는 등 AI 데이터 구축과 관련된 다양한 업무를 수행하고 있는 기업이다. 나는 앞으로 이곳에서 데이터 검수와 라벨링, 큐레이팅 등의 업무를 포함한 연구 보조 업무 를 하게 되었다. 첫 근무날짜는 2026년 10월 06일이다. 일단 계약기간은 3개월 정도로 보고 있으며, 9to6로 진행된다. 처음에는 단순히 새로운 일을 시작한다는 생각이었지만, 생각해보니 지금까지 내가 해왔던 경험과도 꽤 자연스럽게 연결되는 부분이 있다는 생각이 들었다. 나는 원래 데이터 분석을 전공했고, 한동안 데이터 분석에서 멀어져 게임 개발을 공부해왔다. 그리고 지금은 다시 데이터와 관련된 일을 직접 경험하게 되었다. 게임 개발을 하면서도 데이터를 완전히 놓고 있었던 것은 아니다. 게임의 시스템을 설계하고, 플레이 데이터를 바라보고, 프로젝트를 분석하면서 데이터를 통해 문제를 해결하는 방식 을 계속 접하고 있었다. 이제는 그 경험을 다시 데이터 분야와 연결해볼 수 있을 것 같다. 게임 개발은 잠시 쉬어갈 수도 있다 그렇다고 게임 개발을 그만두겠다는 의미는 아니다. FindClover 역시 가능하면 계속해서 개발하고 싶고, 지금까지 진행했던 여러 프로젝트들도 앞으로 포트폴리오와 기록으로 남겨두고 싶다. 다만 앞으로 새로운 업무를 시작하게 되면서 지금까지처럼 게임 개발에 많은 시간을 투자하기는 어려울 것 같다. 특히 하나의 프로젝트를 붙잡고 며칠씩 개발하거나, 새로운 기능을 만들기 위해 계속해서 코드를 수정하는 방식의 작업은 이전보다 줄어들 가능성이 높다. 그래서 당분간은 게임 개발을 잠시 쉬어가는 시기 라고 생각하려 한다. 지금까지 만들어 온 것들을 완전히 내려놓는 것이 아니라, 필요한 부분을 천천히 정리하고 시간이 생길 때 조금씩 다시 개발하는 방향이다. 오히려 지금까지 게임 개발을 하면서 배웠던 것들을 정리하는 것도 앞으로 해야 할 중요한 일이라고 생각한다. 다시 데이터 공부를 시작한다 앞으로는 게임 개발보다 데이터와 관련된 공부에 조금 더 많은 시간을 투자하게 될 것 같다. 예전에 데이터 분석을 공부했지만, 꽤 오랜 시간이 지났기 때문에 다시 처음부터 기초를 다지는 과정이 필요하다고 생각한다. Python을 비롯해 데이터 전처리, 통계, 데이터 분석, 시각화 등의 기본기를 다시 익히고, 이후에는 머신러닝이나 AI와 관련된 내용까지 다시 공부해보고 싶다. 무엇보다 이번에는 실제 현장에서 데이터를 다루는 경험을 하게 된다는 점이 기대된다. 데이터가 어떻게 수집되고, 어떤 과정을 거쳐 가공되고, 검수되는지 직접 경험한다면 지금까지 공부했던 데이터 분석과는 또 다른 관점을 얻을 수 있을 것 같다. 이번 경험을 더 큰 기회로 그리고 개인적으로는 이번 일을 단순히 몇 개월간의 경험으로 끝내고 싶지는 않다. 가능하다면 알체라에서 데이터와 관련된 업무를 수행하면서 내가 가진 역량을 조금씩 키워나가고 싶다. 처음에는 데이터 검수, 라벨링, 큐레이팅 등의 업무를 맡게 되겠지만, 업무를 하면서 데이터의 구조와 AI 데이터 구축 과정에 대해 더 깊이 이해하고, 부족한 부분은 개인적으로 공부하면서 역량을 쌓아가려고 한다. 그렇게 경험과 실력을 쌓다 보면 언젠가는 단순한 보조 업무를 넘어 데이터와 관련된 더 전문적인 업무를 맡을 수 있는 기회도 생길 수 있지 않을까 생각한다. 그리고 가능하다면 장기적으로는 알체라에서 데이터 관련 직무의 정규직으로까지 이어질 수 있다면 좋겠다. 물론 지금 당장 정규직을 목표로 삼기보다는, 우선 주어진 업무를 제대로 수행하고 현장에서 많이 배우는 것이 먼저라고 생각한다. 그 과정에서 내가 어떤 일을 잘할 수 있는지, 어떤 역량을 더 키워야 하는지를 찾아가고 싶다. 새로운 방향 돌이켜보면 지금까지의 과정이 조금 돌아온 것처럼 느껴지기도 한다. 데이터 분석을 공부했다가 게임 개발을 시작했고, 게임을 만들면서 다양한 개발 경험을 쌓았고, 이제는 다시 데이터와 관련된 일을 시작하게 되었다. 하지만 완전히 처음으로 돌아가는 것은 아니라고 생각한다. 데이터 분석을 공부했던 경험 + 게임을 직접 개발하면서 얻은 개발 경험 + 앞으로 현장에서 쌓게 될 데이터 관련 경험 이 세 가지를 앞으로 어떻게 연결할 수 있을지가 새로운 과제가 될 것 같다. 당분간은 게임 개발에 투자하는 시간이 줄어들겠지만, 그만큼 새로운 분야에서 배울 수 있는 것들이 많아질 것 같다. 앞으로 이 블로그에도 게임 개발 과정뿐만 아니라 데이터를 공부하면서 배운 내용, 실제 업무를 통해 알게 된 것들, 그리고 데이터 분석과 개발 경험을 연결해보는 과정을 함께 기록해보려고 한다. 게임 개발을 잠시 쉬어가는 만큼, 이제는 다시 데이터의 길을 걸어보려고 한다. 그리고 이번 경험이 단순히 새로운 일을 시작하는 것에서 끝나는 것이 아니라, 앞으로 내가 어떤 일을 하고 싶은지 다시 찾아가는 과정이 되었으면 좋겠다. 가능하다면 이 경험을 바탕으로 알체라에서 데이터와 관련된 더 전문적인 역할까지 성장하고, 언젠가는 정규직으로 함께할 수 있는 기회까지 만들어보고 싶다. 지금은 그 첫걸음을 시작하는 단계다. 앞으로 어떤 경험을 하게 될지, 그리고 그 경험이 나를 어디까지 이끌어갈지 천천히 기록해보려고 한다.
시작 7월 13일부로 현장실습을 시작해 어느덧 3달이 지나가며 이제 정규직 전환을 앞두고 있습니다. 저는 좋은 기회를 통해 인천에 소재한 설립 2년차 스타트업에 앱 프론트엔드 개발자로 합류하였습니다. 이 글에 3개월간 현장실습을 진행하며 겪은 일과 느낀 점을 담아보려 합니다. 첫 업무 회사에 입사하고 2일간의 필수 교육 이후 대표님을 포함한 회사 전체 인원과 미팅을 가지는 시간이었습니다. 제가 맡은 첫 업무는 가사 싱크 생성 기능 추가였습니다. 이 기능에 대해 상사분과 함께 기획부터 시작하기로 하였습니다. 대표님께서는 이 기능의 자동화를 원하셨으며 AI 기반 LRC 파일 생성 시스템을 구축하는 것이 되었습니다. 저는 사실 학교에 있을때 AI 시스템을 직접 구축해본 경험이 없습니다. 그래서 참 막막했죠,,, codex를 이용해 차근차근 공부를 하기 시작했습니다. 이 기능을 만들기 위해서는 어떻게 접근해야 하는지에 오랫동안 매달렸습니다. 일을 진행하다 엎었다 하는 방식은 학교에서만 하기로 마음먹었으니까요. 그 결과, LRC 파일을 생성하기 위해 Demucs 라이브러리로 MR/보컬 분리 > RMS 분석 & pyannote를 실행해 보컬 시작 시간 후보군 추출 > whisperX 모델로 실제 보컬 시작 시간 기록 의 과정을 거치도록 프로그램을 구현하였습니다. 산출물을 보고드리니 한번에 컨펌을 받고 가사 싱크 기능이 앱에 추가되었습니다. 첫 업무치고 매우 성공적인 결과에 일할 맛이 솟아나기 시작했습니다. 고난의 시작 2025년에 저희 회사에서는 CES 혁신상을 수상했습니다. 그리고 올해도 CES에 제품을 출품하기로 하였습니다. CES에 출품을 위해서는 제품 소개 영상이 필요합니다. 작년도 그렇고 올해도 영상 제작을 외주를 맡겼지만, 외주 결과물이 맘에 들지 않은 대표님들은 직원들을 바라봤습니다. 그러고는 영상 제작이 가능한 사람이 있냐고 물어보셨습니다. 야심에 가득찬 저는 중학교 시절 UCC 제작 과제 경험을 믿고 호기롭게 손을 들었습니다. 영상 제작 담당을 일개 1개월차 인턴이 맡게된 것입니다. 대표님께서 지원해주신 Kling AI와 첫달 무료 2000원에 캡컷 프로를 사비로 결제해 영상 제작에 돌입했습니다. 문제점 영상 외주를 맡기면 영상에 들어갈 앱 UI 이미지들과 회사 제품에 대한 설명들을 넘깁니다. 그러면 외주사에서 영상 구도를 알아서 제작해 결과물을 주다보니 영상 기획에 대해서 잘 아는 인원이 회사에 없었습니다. 그렇기에 영상 제작을 시작조차 못할 상황에 놓였었습니다. 일단 시도해 제가 생각하기에 회사 제품에서 강조해야할 것들을 상기하며 영상 구도를 그려나가기 시작했습니다. 작년에 제출한 영상을 레퍼런스 삼되 너무 같아보이면 안됐기에 꽤나 어려운 작업이었지만, 우여곡절 끝에 초안 영상이 만들어졌습니다. 다시 해와 대표님께서 전체적인 영상 진행은 마음에 들어하셨지만 그 외 모든 것들이 수정사항이었습니다. 가장 큰 문제는 Kling AI 였습니다. 영상에 텍스트가 나오게되면 AI 특유의 깨진 텍스트들이 난무해 이대로 가단 낙제가 분명했습니다. 그래서 저는 AI의 비중을 매우 낮춰 맥락 이해에 필요한 배경 상황극만 AI로 제작하였습니다. 제품 설명에 필요한 모션 그래픽, UI 컨트롤 등은 jitter, 캡컷을 사용해 직접 한땀한땀 수제작하였습니다. 하지만 대표님의 요구사항을 충족하기란 매우 어려웠고, 총 11회의 수정 끝에 영상을 완성할 수 있었습니다. 결과 상사분들의 말씀에 의하면 처음엔 불합격이었다가 추가 합격으로 선정되었다고 하였습니다. 매우 힘들고 지치는 과정이었지만 한편으로는 회사에서 한자리하게 된 것 같고 상사분들에게도 인정 받을 수 있는 좋은 기회가 됐던 것 같습니다. 다시 개발자로 영상 제작을 끝냈을 당시 막 1달 반이 지난 시점이었습니다. 보름간 개발자에서 벗어나 영상 제작자로 살아가니 다시 개발이 너무 하고싶어 상사분들께 할 일이 없는지 이것저것 물어보았고, 회사 홈페이지의 다국어 기능을 디벨롭해 개발할 때에는 한국어만 작성해도 자동으로 여러 언어가 생성되는 기능이 필요하다는 답을 받았습니다. 기존에 있던 다국어 기능 개발 방식과 너무 달라 애를 먹었습니다. 기획의 시작점이 될 아이디어조차 떠오르지 않았거든요. 그렇게 고민의 고민을 반복하다가 학교에서의 경험들이 스쳐지나갔습니다. 내가 많이 한거? 라이브러리 제작. 라는 생각이 들었습니다. 현재 회사에서는 freezed를 통해 클래스 메서드를 생성하여 사용하고 있습니다. 이것에서 영감을 받아 '빌드할 때 번역본들을 생성해 언어셋에 추가하자' 라는 아이디어를 도출했습니다. 이 번역 기능에서 번역을 담당할 AI를 제작하시는 분과 함께 API 규약을 기획하였습니다. 그 결과 시작점이 된 아이디어와 99% 동일하게 제작하여 pub.dev에 배포하며 프로젝트를 완성 할 수 있었습니다. 회사에 와서 학교에서 공부했던 기술을 너무 안써서 공부한게 이대로 물거품이 되나 싶었던 찰나에 아주 큰 영감을 받을 수 있어 열심히 살았던 과거의 제게 고마웠습니다. 생각의 변화 저는 사실 취업 직전까지만 해도 변해가는 세상을 부정하며 살았습니다. AI가 기술을 점령한 시대에 이런 사실을 부정하며 리액트 이론, Nextjs 작동 방식과 같은 지식들이 가치가 있다고 애써 믿어왔습니다. 이런 변화들을 인정하면 취업 전까지 공부한 모든 것들에 대한 가치를 지워버리는 것 같아서 였습니다. 그런데 지금은 아닙니다. 회사에서 일을 해보니 쓰기 싫어도 써야하는게 ChatGPT이고 제 지식이 필요한 순간보다 GPT의 업무 속도가 필요한 상황들이 월등히 많았습니다. 공부 좀 했다고 알량한 자존심 부렸던 제가 후회됐죠. 그 시간에 빨리 변화를 받아들였다면, 내 강점을 저물어 가는게 아닌 떠오르는 것으로 채울 수 있었다면 하는. 결과적으로 지금 저는 다른 사람들보다 나은 점이 없습니다. 그냥 신입 개발자 그 이상도 이하도 아닙니다. 제 실력에 대한 믿음은 이제 남에게 증명할 수도, 증명할 것도 없게 됐습니다. 다행인 점은 제가 가져야할 소양보다 제 실력이 낮지는 않다는 것입니다. 신입 개발자가 신입의 실력인 것이 잘못된 일은 아니니까요. 저는 그래서 생각을 고쳐잡고 기술 공부를 멈췄습니다. 물론 회사에서 쓰는 기술에 대한 어느정도 지식은 있어야겠지요. 하지만 지금 제게 중요한 것은 무엇을 어떻게 만드느냐 가 아니라 생각하느냐 입니다. 이렇게 만들었다 보다 이렇게 생각했다 가 더 중요한 시대인 것 같습니다. 클로드 해커톤과 같은 AI 해커톤의 대상수상자가 개발자가 아닌 경우들이 이 사실을 증명합니다. 각자 본인의 필드에서 느낀 문제점과 불편함을 해결할 생각들이 있던 사람들이죠. 저 또한 그런 사람이 되고 싶습니다. 처음 개발자를 하고 싶었던 이유는 주변의 불편함들을 외면하지 않기 위해서였습니다. 학교를 다니며 취업이라는 현실을 마주하니 기술을 공부했었지만, 아이러니하게도 지금 취업을 하기 위해서는 처음 가졌던 마음을 추구해야 하도록 변해 있었습니다. 저는 이 시대가 개발자라는 직업에게 위기인 상황이라 생각하지 않습니다. 저 뿐만이 아닌 모든 개발자들이 가진 꿈으로 우리가 아닌 세상이 다가온 상황이 됐다고 생각합니다. 현재로 저는 현재 회사에서 사용할 AI 인프라를 기획하고 있습니다. 대표님께서 AI native로 전환을 염두에 두고 계셔 전 직원에게 AI 인프라를 구상해보라고 하셨습니다. 앞서 말한 생각의 변화를 적용하기에 더 없이 좋은 상황이죠. 거창하게 말하면 회사 내에서 개발자라는 직업의 Role 전환을 꿈꾸고 있습니다. 가지고 있던 무기인 코딩 능력은 AI가 뺐었으니 회사에서 할 수 있는 다른 가치를 창출하고, 저만이 아닌 회사 전 직원분들이 업그레이드 된 새로운 무기들을 장착할 수 있으면 좋겠습니다. 다 닳아 없어진 강점이 아닌 변해가는 세상에서 내세울, 증명 가능한 진짜 강점을 가지는 기회가 되었으면 합니다. 함께 빠르게 변하는 세상을 헤쳐가기 위해서 말이죠. 마무리하며 개발자 취준 중이신 분들이나 소마고 후배님들이 이 글을 읽는다면 아직 자리는 있습니다. 다만 기존에 있던 지침서들만 따라간다면 여러분이 얻게될 무기는 녹슬어 있을 것 같습니다. 이 시대가 원하는 사람이 어떤 것인지 생각해보는 시간을 가지셨으면 좋겠습니다. 단순히 선배가 했던대로, 학교에서 알려주는 대로는 의미 없습니다. 하루가 다르게 세상이 변하는데 작년 제작년은 참고 자료가 될 뿐, 정답지가 아닙니다. 우리가 더 뛰어난 좋은 개발자로 만나게 될 미래가 기대됩니다. 긴 글 읽어주셔 감사합니다. 훈수는 언제나 환영
기존 GitOps 운영 글 에서 Prometheus와 Loki로 상태를 보는 흐름을 다뤘습니다. 오늘 목표는 관측 서비스 접근 경계와 수집 데이터의 비밀 제외 를 함께 확인하는 것입니다. 앱을 보호하면서 로그 화면은 누구나 볼 수 있게 두면 경계가 남습니다. 읽기 화면에도 운영 정보가 있습니다 Prometheus API·metrics·디버그 경로에는 시스템 정보가 있습니다. 공개 노출을 피하고 필요한 접근 통제를 구성해야 합니다. 운영자만 써야 하는 관리·재로딩 경로도 따로 점검하세요. 대시보드의 보기 권한만 설정했다고 데이터 소스의 접근이 제한됐다고 단정하면 안 됩니다. Prometheus 보안 모델 전제는 실습 관측 namespace, 이미 검토된 인증 프록시와 TLS, 합성 telemetry 데이터입니다. 실제 토큰과 사용자 데이터를 테스트 입력으로 사용하지 않습니다. 그림의 각 경계는 독립적으로 확인합니다. Collector에서 하나의 속성을 지웠다고 앱 로그와 모든 backend 데이터가 정제되는 것은 아닙니다. Loki의 tenant 헤더는 로그인 비밀번호가 아닙니다 Loki의 multi-tenant 모드에서 X-Scope-OrgID 는 tenant 식별에 쓰입니다. 클라이언트가 임의로 헤더를 넣을 수 있는 경로를 그대로 신뢰하면 안 됩니다. 인증 프록시가 확인한 신원에서 tenant를 결정하고 전달 경로를 통제하는 설계가 필요합니다. auth_enabled: true 하나가 완성된 사용자 인증 시스템은 아닙니다. Loki 인증 안내 인증 프록시를 두어도 backend를 다른 주소로 직접 호출할 수 있다면 우회 경로가 남습니다. Kubernetes Service·Ingress·NetworkPolicy와 실제 route를 같이 점검하세요. Loki mTLS는 전송 계층 신원 검증이며 tenant 권한 매핑은 별도입니다. Collector 속성 삭제 예제 아래는 해당 processor가 포함된 Collector 배포판 의 설정 조각입니다. receiver·exporter·TLS와 인증 구성은 별도로 준비해야 합니다. 모든 Collector 배포판에 같은 component가 있다고 가정하지 마세요. processors: attributes/remove-sensitive: actions: - key: http.request.header.authorization action: delete - key: user.email action: delete - key: session.id action: delete service: pipelines: traces: receivers: [otlp] processors: [attributes/remove-sensitive, batch] exporters: [otlp/approved] processor를 정의하는 것과 pipeline에서 사용하는 것은 다릅니다. 예제는 trace pipeline에 연결했습니다. logs·metrics를 함께 받는다면 그 경로와 attribute 위치도 따로 검토해야 합니다. 가능하면 앱에서 처음부터 민감값을 수집하지 않는 것이 출발점입니다. OpenTelemetry 민감 데이터 처리 삭제할 key 이름은 사용한 instrumentation과 실제 수집 형태에 맞춰야 합니다. log body, resource attribute, URL query에 비밀이 있다면 위 세 속성 삭제로 해결되지 않습니다. 알려진 키를 지우는 예제를 전체 데이터 익명화라고 부르지 않았습니다. 합성 입력으로 확인하기 합성 attribute 예제 처리 목표 http.request.header.authorization 삭제 user.email 삭제 session.id 삭제 http.request.method 유지 로컬에서는 이 표대로 속성 집합이 바뀌는지만 검사했습니다. 실제 Collector에 합성 span을 보내 backend에 남은 값을 읽는 통합 검증은 별도입니다. 민감값이 들어 있는 원본을 테스트 로그로 출력하면 검증 과정에서 유출이 생길 수 있으므로 값 대신 제거 여부만 기록하세요. 다음은 독자용 설정 조회 안내입니다. 사용자 환경에는 실행하지 않았습니다. kubectl get service -n observability kubectl get ingress -n observability kubectl get networkpolicy -n observability 그다음 승인된 실습에서 인증 없는 조회가 거부되는지, 허용 사용자가 자기 tenant만 읽는지, 다른 tenant 헤더를 시도해도 범위가 바뀌지 않는지 검사합니다. 존재하지 않는 경로의 404와 인증 거부를 구분해야 합니다. 적용과 복구 합성 데이터부터 시작해 좁은 pipeline에 정제를 적용하고 필요한 운영 정보가 남는지 확인합니다. 대시보드 장애가 생기면 익명 접근을 여는 대신 인증 전달·권한·TLS 신뢰와 프록시 우회 경로를 확인합니다. 되돌림은 검토된 이전 Collector 구성에서 필요한 측정값을 복원하는 작업입니다. 비밀 수집을 다시 켜는 방식으로 화면을 복구하지 않습니다. 이미 저장된 민감 데이터는 새 processor로 소급 삭제되지 않으므로 별도 보존·삭제 절차가 필요합니다. 확인 문제 auth_enabled: true 만으로 Loki 사용자 로그인까지 완성될까요? processor를 정의만 해도 모든 telemetry가 지나갈까요? 세 attribute를 삭제하면 log body의 비밀도 없어질까요? 답과 해설: 1. 신원 인증과 tenant 매핑은 별도입니다. 2. 각 pipeline에 연결해야 합니다. 3. body와 다른 위치는 따로 점검해야 합니다. 오늘은 수집 위치를 나누고, 내일은 다른 tenant 반례를 설명해 보세요. 일주일 뒤에는 공개 route와 telemetry 필드 목록을 다시 검토하세요. 버전과 검증 범위 2026-10-04 Prometheus·Loki latest 및 OpenTelemetry 공식 문서 확인. 설치 버전·Collector 배포판 지원은 실환경에서 확인해야 합니다. 로컬 YAML, processor 연결, 합성 attribute 제거·pipeline 누락 반례를 검증했습니다. 인증 프록시·Collector·backend 통합 동작은 실행하지 않았습니다.
기존 CNCF 시리즈 에서 Harbor의 이미지 저장소 역할을 살펴봤습니다. 이번 목표는 누가 올리는지, 배포할 내용이 무엇인지, 어떤 검사를 거쳤는지 를 분리해서 확인하는 것입니다. 저장소 로그인 성공만으로 이미지가 믿을 만해지지는 않습니다. 같은 이름으로 다른 내용이 들어오면 가상의 app:release 를 배포했다고 해 보겠습니다. 태그가 나중에 다른 이미지로 이동하면 같은 YAML을 재배포해도 내용이 달라질 수 있습니다. Harbor의 tag immutability는 선택한 태그 변경을 제한합니다. 배포 시 digest로 대상을 지정하면 내용 식별을 더 명확하게 기록할 수 있습니다. Tag immutability 전제는 Harbor 2.14 문서 기준의 프로젝트, TLS 신뢰 경로, 승인된 robot 계정, 실제 이미지와 스캔 도구입니다. 배포 주체와 이미지 업로드 주체를 분리하는 상황을 다룹니다. 각 단계는 서로 다른 질문입니다. 스캔이 끝났다는 사실과 신뢰한 빌드 주체의 서명이 확인됐다는 사실도 구분해야 합니다. robot 계정은 역할별로 프로젝트 robot은 해당 프로젝트의 자동 작업에 사용합니다. 배포용 계정에는 Pull만, 이미지 업로드 계정에는 필요한 Pull과 Push를 검토합니다. Harbor 2.14에서는 Push를 부여할 때 Pull도 함께 필요합니다. 만료·교체·비활성화 경로를 미리 정해 두세요. 프로젝트 robot 권한 역할 예시 권한 제외할 권한 배포 이미지 읽기 Pull Push·삭제·관리 CI 업로드 Pull + Push 프로젝트 관리 검토 담당 필요한 결과 조회 장기 robot 비밀 공유 robot 비밀은 secret store나 승인된 런타임 전달 경로로 다룹니다. 명령 인수·워크플로 로그·글 예제에 실제 값을 넣지 않습니다. 토큰을 만들었다는 기록과 배포가 어떤 토큰을 사용하는지는 별도로 점검해야 합니다. digest를 배포 정의에 남기기 다음은 Deployment의 spec.template.spec 에 들어가는 PodSpec 조각 입니다. registry와 digest는 합성이므로 그대로 pull할 수 없습니다. 실제 승인된 이미지의 digest와 이미 준비한 pull Secret 이름으로 교체해야 합니다. automountServiceAccountToken: false imagePullSecrets: - name: study-registry-pull containers: - name: app image: registry.example.com/study/app@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef imagePullPolicy: IfNotPresent digest는 내용 식별입니다. 그 자체가 출처 신뢰나 취약점 없음의 증명은 아닙니다. IfNotPresent 는 로컬 캐시 사용을 허용하므로 registry에서 pull을 차단했어도 이미 캐시된 이미지나 실행 중인 워크로드를 자동으로 제거하지 않습니다. 실제 배포 경계는 별도 검토해야 합니다. 스캔과 서명 결과를 읽는 기준 Not Scanned , Unsupported , Scanning , 실패와 Complete 를 구분합니다. 스캐너가 지원하지 않는 대상은 취약점 0개와 같지 않습니다. 스캐너·DB 시점·대상 아키텍처·적용 임계값을 함께 기록하세요. Harbor 스캔 상태 Harbor는 Cosign·Notation 서명을 저장하고 content trust 기능을 제공하지만, 화면에 서명 accessory가 보이는 사실만으로 조직의 신뢰한 signer를 검증한 것은 아닙니다. 배포 전에 어떤 신원을 신뢰하는지 명시한 검증 정책이 필요합니다. 서명과 content trust 조회와 변경 검증 아래는 독자용 조회 안내입니다. 사용자 registry·클러스터에는 실행하지 않았습니다. kubectl get deployment app -n image-study -o jsonpath='{.spec.template.spec.containers[*].image}' kubectl get pods -n image-study -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.status.containerStatuses[*].imageID}{"\n"}{end}' 템플릿과 실행된 imageID를 비교하고, Harbor UI에서 해당 digest의 스캔 상태·robot 권한·immutable 규칙을 조회합니다. tag와 digest의 관계, 다중 아키텍처 image index와 실제 플랫폼 이미지 차이도 남겨야 합니다. 실습에서 제한된 태그 재업로드가 거부되는지, pull 전용 계정의 Push가 거부되는지 확인합니다. 문제 발생 시 임계값을 무조건 낮추거나 TLS 검증을 끄지 않습니다. 되돌림은 이전에 검증한 digest와 배포 정의를 복원하는 것입니다. 그 digest의 현재 취약점 상태도 다시 검토하세요. 확인 문제 digest가 고정되면 취약점과 출처 검증도 끝난 것일까요? Unsupported 는 취약점이 없다는 결과일까요? registry pull 차단이 실행 중인 Pod까지 제거할까요? 답과 해설: 1. 내용 식별과 보안 검증은 별도입니다. 2. 검사하지 못한 상태입니다. 3. 실행 중이거나 캐시된 이미지는 별도 경계입니다. 오늘은 세 질문을 배포 기록에 넣고, 내일은 태그 이동 반례를 설명해 보세요. 일주일 뒤에는 robot 만료와 스캔 시점을 점검해 보세요. 버전과 검증 범위 2026-10-04 Harbor 2.14.0 문서 확인. 로컬 YAML과 digest 형식, tag-only 반례, Pull/Push 권한 분리·스캔 상태 분류를 검증했습니다. 실제 robot 인증·이미지 스캔·서명 검증·pull·배포는 실행하지 않았습니다.
S3에 저장된 파일이 암호화됐다는 표시를 보고 외부 공개도 막혔다고 생각하기 쉽습니다. 하지만 정상 권한으로 파일을 읽는 요청에는 서비스가 내용을 제공할 수 있습니다. 이번에는 공개 접근, 객체 소유권, 전송 보호 를 각각 점검하겠습니다. 기존 AWS 시리즈 에서 서비스별 역할을 정리한 데 이어, 이번에는 정상 업무를 유지하면서 접근 범위를 줄이는 방법을 살펴봅니다. S3 버킷과 객체, IAM 정책을 알고 있으면 읽을 수 있습니다. 사내 보고서를 저장하는 가상 버킷이며 공개 웹사이트 용도는 아닙니다. 서로 다른 세 가지 질문 Block Public Access는 정책과 ACL 등을 통해 공개 접근이 허용되는 것을 제한합니다. 버킷 설정만 보지 않고 계정과 적용되는 조직 설정, 액세스 포인트도 함께 확인해야 합니다. 더 엄격한 조합이 적용될 수 있습니다. S3 공개 접근 차단 Object Ownership의 BucketOwnerEnforced 는 ACL을 비활성화하고 버킷 소유자가 객체를 소유하도록 하는 설정입니다. IAM과 버킷 정책이 필요 없어지는 기능이 아닙니다. 기존 업로드 클라이언트가 ACL을 보내는지 전환 전에 확인합니다. 객체 소유권과 ACL 전송 보호는 HTTPS를 사용하는 질문입니다. 저장 암호화 여부와 다른 경계입니다. 데이터가 저장될 때 보호돼도 네트워크 요청 자체를 HTTP로 허용해 둘 수 있습니다. 그림의 세 칸은 어느 하나만 통과하면 충분하다는 뜻이 아닙니다. 정상 역할이 필요한 파일만 읽는지까지 별도 확인합니다. 버킷 속성의 예 아래 JSON은 CloudFormation AWS::S3::Bucket 의 Properties 에 들어가는 속성 조각 입니다. 버킷 정책과 암호화 설정, 전체 템플릿은 포함하지 않았습니다. { "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "IgnorePublicAcls": true, "BlockPublicPolicy": true, "RestrictPublicBuckets": true }, "OwnershipControls": { "Rules": [{"ObjectOwnership": "BucketOwnerEnforced"}] } } 네 항목을 모두 참으로 적었습니다. 각각 같은 설정의 별명이 아니므로 하나만 켜고 같은 효과라고 생각하지 않습니다. 기존 ACL과 정책 내용이 정리됐다는 의미도 아닙니다. 구조와 용도는 PublicAccessBlockConfiguration , OwnershipControls 에서 확인할 수 있습니다. HTTPS 요구는 별도 정책입니다 아래는 가상 버킷 정책의 거부 Statement입니다. 권한을 부여하는 전체 정책은 아닙니다. AWS 서비스 간 호출에서는 요청 컨텍스트가 일부 가려질 수 있어 서비스 주체를 구분하는 조건도 넣었습니다. { "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::amzn-s3-demo-hardening", "arn:aws:s3:::amzn-s3-demo-hardening/*" ], "Condition": {"Bool": { "aws:SecureTransport": "false", "aws:PrincipalIsAWSService": "false" }} } Principal: "*" 가 있지만 이 Statement는 Deny 입니다. 별표만 보고 공개 허용 정책이라고 판단하면 의미가 바뀝니다. 예제는 두 조건이 함께 맞는 비서비스 주체의 HTTP 요청을 거부하려는 것입니다. HTTPS 요청을 허용하는 권한은 별도로 있어야 합니다. S3 전송 암호화 권장 사항 , AWS 서비스 주체 조건 기존 서비스가 끊기지 않도록 버킷 정책, 액세스 포인트, 업로드 ACL, 공개 배포 여부를 목록으로 만듭니다. 테스트 버킷에서 정상 역할의 업로드·읽기가 되는지 확인합니다. 권한 없는 익명 읽기와 HTTP 요청은 서로 다른 시험으로 확인합니다. 공개 웹사이트 같은 예외 용도는 이 사내 보고서 예제와 분리해 설계합니다. 되돌릴 때는 실패한 클라이언트의 호출 조건을 먼저 확인하고 바꾼 항목만 복구합니다. 문제를 해결하려고 계정 전체의 공개 접근 차단을 무작정 끄면 다른 버킷까지 영향을 받을 수 있습니다. 기존 공개 접근이 필요한지는 소유자와 검토하고, 예외의 범위를 기록합니다. 미리 서명된 URL도 따로 생각해야 합니다. URL을 발급한 주체의 권한과 만료가 관련되며, URL을 공유하면 의도한 상대 외에도 사용될 수 있습니다. “공개 차단을 켰으니 URL 공유도 신경 쓰지 않아도 된다”는 결론으로 이어지지 않습니다. 로컬 검증: 두 JSON 조각을 파싱하고 공개 차단 네 항목, ACL 비활성화, TLS 거부 조건을 검사했습니다. 공개 차단 하나를 끈 반례와 Deny 를 Allow 로 바꾼 반례는 탈락했습니다. 실제 S3 접근 평가, 업로드 호환성, HTTPS 연결은 시험하지 않았습니다. 확인 문제 저장 암호화가 켜져 있으면 익명 읽기도 차단될까요? Deny 의 Principal: "*" 는 모두에게 권한을 주는 뜻일까요? 정상 업로드가 실패할 때 공개 차단 전체를 끄기 전에 무엇을 볼까요? 답과 해설 아닙니다. 저장 보호와 읽기 권한은 다릅니다. 아닙니다. 조건에 맞는 요청을 거부하는 범위를 나타냅니다. 업로드 ACL, 소유권 전환, 요청 프로토콜과 적용된 정책을 봅니다. 복습 오늘은 공개 차단·소유권·TLS가 답하는 질문을 하나씩 써 보세요. 내일은 HTTPS이지만 권한 없는 요청이 왜 여전히 거부돼야 하는지 설명해 보세요. 일주일 뒤에는 KMS 복호화 권한까지 포함해 읽기 경로를 그려 보세요. 확인일: 2026-10-04, 한국 시간 . S3와 CloudFormation 속성, IAM 전역 조건 키 기준입니다. 모든 버킷 이름은 가상입니다.
Reliable swimming pool maintenance in Abu Dhabi protects your water quality, your equipment, and your family's health. Atlanta Pools sees every day how heat, dust, and humidity push pools to their limits. However, a clear routine keeps most problems away. In this guide, you will learn which tasks matter, how often to perform them, and when to call experts. Moreover, you will see how pool care connects with surfaces, leaks, lighting, gardens, and water features. Want crystal-clear water all year? Book a free inspection and let our team check your pool today. Why Swimming Pool Maintenance in Abu Dhabi Matters More Than Elsewhere Abu Dhabi pools face harsh conditions. Summer air passes 45°C, and water often stays above 30°C. Warm water speeds up algae and bacteria growth. As a result, a neglected pool can turn green within days. Strong sunlight also burns off chlorine, so protection fades quickly. Dust adds more pressure. Wind carries sand into the water, and filters clog faster. Meanwhile, salt air near the coast attacks metal fittings and stone. For these reasons, a smart swimming pool investment always includes a long-term care plan. Villa owners feel the difference most. A modern villa with pool ideas guide shows how pools shape daily life, from morning swims to evening gatherings. Therefore, clean water becomes part of the home experience, not just a technical detail. Rules also matter. Authorities expect pools to stay hygienic and safe. The municipality pool hygiene guidance highlights regular upkeep and proper water quality. Consistent swimming pool maintenance in Abu Dhabi helps owners meet these expectations with confidence. Time also works against owners. Algae can take hold in a single weekend, and fixing a green pool costs far more than preventing one. Therefore, steady swimming pool maintenance in Abu Dhabi saves chemicals, energy, and stress. Owners who skip routine care often face drained pools, replaced filters, and weeks without swimming. Children and older family members also need extra protection. Their skin and eyes react more strongly to poor water quality, so stable chemistry is a health matter. What Swimming Pool Maintenance in Abu Dhabi Includes Maintenance covers the whole pool system, not only the water you see. Technicians test, adjust, inspect, and repair every key part. The list below shows the core tasks: Water testing: Technicians measure chlorine, pH, alkalinity, calcium hardness, and stabiliser. Chemical balancing: They add only what the readings justify. Skimming and brushing: They remove debris and stop biofilm from forming. Vacuuming: They lift fine silt from the pool floor. Basket and strainer care: They keep water flowing freely. Filter service: They backwash sand filters or rinse cartridges. Equipment checks: They inspect pumps, valves, heaters, and controls. Cleaning and maintenance work together. Professional pool cleaning services handle the visible surface, while maintenance protects the systems behind it. Many owners also read our guide to a reliable swimming pool cleaner to understand what a good visit looks like. Records complete the picture. After each visit, technicians log readings and repairs. This history reveals trends, such as slowly rising pressure or falling chlorine. Therefore, strong swimming pool maintenance in Abu Dhabi always includes written reports. Technicians also follow a clear order of work. First, they test the water. Next, they clean the surface and floor. Then they adjust the chemistry once circulation has mixed the water. This sequence matters, because adding chemicals before cleaning wastes product. Skilled teams delivering swimming pool maintenance in Abu Dhabi follow it on every visit. Pumps, Filters, Lighting, and Circulation Circulation keeps water clean. The pump pulls water through the skimmers, pushes it through the filter, and returns it to the pool. If this loop fails, chemistry alone cannot save the water. Therefore, regular equipment checks deserve equal attention. Pumps work hard in Abu Dhabi. Long run times and high heat wear out seals and motors. Warning signs include noise, vibration, and weak flow. When a unit fails, swimming pool pump installation by trained technicians restores proper circulation and lowers energy use. Pool design also changes the routine. An overflow swimming pool design uses balance tanks, weirs, and extra pipework that need regular flushing. Likewise, saltwater systems need cell inspections and salinity checks. Lighting needs care too. Moisture can enter damaged seals and shorten the life of fittings. Our swimming pool lights guide explains the main types and safety points. Technicians should test lights during routine visits and report flickering or discolouration. Filters deserve a closer look. Sand filters need regular backwashing, while cartridges need rinsing and eventual replacement. A rising pressure gauge usually signals a clogged filter. Meanwhile, a falling gauge may point to a pump or valve problem. Professional swimming pool maintenance in Abu Dhabi includes reading these signals and acting early. Calibration also matters for dosing systems. Sensors drift over time, so technicians check them regularly. Accurate readings always mean accurate chemical decisions. Tiles, Coping, and Surfaces Surfaces take constant punishment. Sun, chemicals, and swimmers all wear them down. Tiles lose grout, coping stones fade, and plaster roughens. Rough surfaces then trap dirt and feed algae. Tiles deserve regular attention. Sunscreen and minerals leave a ring at the waterline that needs scrubbing. Choosing durable finishes also helps, so explore the best swimming pool tiles for Abu Dhabi homes before you replace damaged areas. The pool edge matters as well. Heat-resistant swimming pool coping tiles stay cooler underfoot and protect the wall from water damage. Meanwhile, loose or cracked coping lets water seep behind the shell. Inspect the edge every few months and repair gaps quickly. Clean surfaces also protect water balance. Smooth tiles shed algae more easily than rough plaster. As a result, careful surface care lowers chemical use and reduces brushing time. Maintenance needs differ by finish. Tiles clean easily with regular brushing, while plaster needs careful chemistry to avoid staining. Grout also needs inspection, because gaps let water reach the shell. Ask your technician for a simple care guide, so you protect surfaces from the first week. Consistent swimming pool maintenance in Abu Dhabi keeps finishes attractive far longer. Waterline care deserves a reminder. Sunscreen, body oils, and minerals leave a dull ring that needs regular scrubbing and the right cleaner. Leaks, Waterproofing, and Early Repairs Small leaks cause big losses. A pool that drops more than a few centimetres a week may be leaking. Meanwhile, hidden leaks damage soil, paving, and nearby structures. Therefore, act quickly when the water level falls without clear reason. Start with a simple bucket test to compare pool and bucket evaporation. Then call specialists if the gap looks large. A professional pool leak detection service can trace pipe, skimmer, and shell leaks without breaking the deck. Waterproofing also protects the structure. Failed membranes allow water to reach concrete and reinforcement. Read our swimming pool waterproofing guide to learn how materials and methods differ. Some pools need more than repairs. Cracked plaster, stained tiles, and worn finishes may call for a swimming pool renovation company to resurface the shell. Fresh finishes improve water clarity and cut cleaning time. Early action keeps swimming pool maintenance in Abu Dhabi simple and affordable. Leaks often start small. A worn seal, a loose fitting, or a cracked pipe can waste thousands of litres over a season. Moreover, constant water loss dilutes chemicals and raises bills. Technicians who perform swimming pool maintenance in Abu Dhabi watch the water level every visit, so they spot unusual loss early. Seasonal Schedules for Villas, Indoor Pools, and Private Retreats Pool type and season decide how often technicians should visit. A simple calendar keeps your plan realistic. Use the guide below as a starting point. Summer (June to September): Villa pools usually need two to three visits each week. Test chlorine and stabiliser often, because heat burns sanitiser fast. Autumn (October to November): Clear fallen leaves, scrub the waterline, and inspect equipment after the long summer. Winter (December to February): Cooler water uses less chlorine. Therefore, one or two visits a week often suffice, but equipment checks still matter. Spring (March to May): Descale tiles, service filters, and prepare the system for rising heat. Different pools need different care. A private pool Abu Dhabi setup for a hotel room or spa sees heavy use and needs close monitoring. Likewise, an indoor pool Abu Dhabi needs extra attention to humidity, ventilation, and air quality. Dust storms break every schedule. After heavy dust, book an extra visit within a day. This quick response keeps filters clear and protects pump motors. Reliable swimming pool maintenance in Abu Dhabi adapts to weather, not only to the calendar. Holidays need a plan too. Many residents travel in summer, and an unattended pool can turn green within a week. Therefore, arrange extra visits before you leave and after you return. A written holiday plan makes swimming pool maintenance in Abu Dhabi easy, even when you are far away. Rooftop and plunge pools need special care as well. Small volumes change quickly, so testing must be frequent and doses must be precise. Contracts, AMC Plans, and Long-Term Costs Many owners prefer a yearly agreement. An annual maintenance contract bundles visits, testing, and priority support into one plan. As a result, costs become predictable, and help arrives faster during heatwaves. Compare pool AMC service contracts to see how scope and pricing differ. Check these points befor
Unity 2D 모바일 게임 FindClover 개발 중간점검 클로버를 찾아 제한 시간 안에 최대한 높은 점수를 획득하는 2D 모바일 게임 Unity / Android / Touch Input / JSON Save / 광고 / 성장 시스템 / 어빌리티 시스템 현재 제작하고 있는 FindClover 의 개발 과정을 중간점검해보려고 한다. 처음에는 단순히 화면에서 클로버를 찾아 터치하는 게임으로 시작했지만, 개발을 진행하면서 게임의 기본 루프뿐만 아니라 재화, 성장, 광고, 능력, 상점, 뽑기 시스템까지 점점 확장되었다. 이번 글에서는 지금까지 어떤 시스템을 구현했고, 개발 과정에서 어떤 문제를 해결했는지 정리한다. 1. FindClover는 어떤 게임인가? FindClover는 모바일 환경을 기준으로 제작하고 있는 2D 캐주얼 게임이다. 기본적인 게임 플레이는 간단하다. 게임 시작 화면에 여러 클로버가 생성된다. 제한 시간 안에 클로버를 찾아 터치한다. 세잎클로버와 네잎클로버를 구분하여 획득한다. 제한 시간이 종료되면 결과를 계산한다. 획득한 보상을 이용해 성장한다. 성장한 능력을 이용해 다시 게임을 플레이한다. 즉, 클로버 찾기 → 보상 획득 → 성장 → 다시 클로버 찾기 라는 반복 구조를 목표로 했다. 처음에는 게임의 핵심 플레이만 구현하는 것이 목적이었지만, 이후 반복 플레이에 대한 동기를 만들기 위해 성장 시스템과 재화 시스템을 추가했다. 2. 프로젝트 초기 구성 프로젝트 초기에 먼저 게임의 기본적인 구조를 만들었다. 초기 커밋에서는 다음과 같은 시스템을 순서대로 구현했다. Title / Option UI UI Manager Game Manager Clover Manager Clover Spawn Manager Touch / Drag 시스템 카메라 이동 Sound Manager Haptic Manager InGame UI Pause UI Game End UI Scene Load Manager 처음부터 모든 시스템을 완성하기보다는 게임의 기본적인 실행 흐름을 먼저 만드는 방향으로 진행했다. 특히 게임의 중심이 되는 부분은 GameManager → SpawnManager → CloverManager → TouchController 의 흐름이다. 3. 클로버 생성 시스템 게임의 핵심 오브젝트는 클로버이다. 클로버의 종류를 구분하고 이를 관리하기 위해 Clover 와 CloverManager 를 분리했다. Clover └─ 개별 클로버의 상태 및 동작 CloverManager └─ 클로버 전체 관리 SpawnManager └─ 게임 시작 시 클로버 생성 세잎클로버와 네잎클로버를 각각 관리하고, 스테이지 데이터에 따라 생성 개수와 크기를 다르게 설정할 수 있도록 구성했다. 이를 통해 스테이지마다 세잎클로버 개수 네잎클로버 개수 클로버 크기 제한 시간 보상 등을 다르게 설정할 수 있는 기반을 만들었다. 4. 모바일 터치 입력 구현 FindClover는 PC 게임이 아니라 모바일 게임을 목표로 했기 때문에 터치 입력이 매우 중요했다. 초기에는 단순 터치뿐만 아니라 화면을 드래그하여 맵을 확인하는 방식도 구현했다. Touch ├─ 클로버 선택 └─ Drag └─ 화면 이동 이 과정에서 Unity Input System을 이용해 터치 입력을 처리했다. 이후 실제 모바일 환경을 고려하면서 터치 UX를 계속 수정했다. 특히 중요한 문제가 화면 좌표와 월드 좌표의 차이 였다. 5. UI 좌표계와 월드 좌표계 문제 개발 중 클로버가 생성되는 영역을 조정하면서 좌표계를 크게 수정했다. 초기에는 월드 좌표를 기준으로 클로버의 생성 범위를 설정했다. X : -5.5 ~ 5.5 Y : -7.65 ~ 7.35 하지만 실제 모바일 UI를 기준으로 게임 화면을 구성하면서 UI 좌표를 기준으로 관리하는 것이 더 적합하다고 판단했다. 그래서 이후에는 Canvas 기준으로 다음과 같은 범위를 사용하도록 변경했다. X : -290 ~ 290 Y : -500 ~ 500 이 과정에서 단순히 좌표 값만 변경하는 것이 아니라, 터치 위치 → UI 좌표 → 게임 오브젝트 위치 의 관계를 다시 정리했다. 모바일 게임에서는 화면 해상도와 Canvas 설정에 따라 입력 좌표가 달라질 수 있기 때문에 이 부분이 생각보다 중요했다. 6. 클로버 찾기 판정 방식 개선 클로버를 찾는 과정에서도 UX 문제가 있었다. 처음에는 작은 영역을 기준으로 터치를 판정했지만, 모바일에서는 손가락으로 정확한 위치를 누르기 어려웠다. 그래서 일정 범위 안을 터치해도 클로버를 선택할 수 있도록 판정 영역을 조정했다. 초기에는 월드 좌표 기준으로 약 0.8 정도의 탐지 반경을 사용했고, 이후 UI 기반 구조에서는 약 80px 수준의 재선택 영역을 사용하도록 변경했다. 결국 중요한 것은 실제 스프라이트의 크기보다 사용자가 편하게 누를 수 있는 영역을 제공하는 것 이었다. 모바일에서는 정확한 판정보다 적절한 입력 관용성이 더 중요하다는 것을 확인할 수 있었다. 7. Depth Sorting 2D 게임이지만 클로버가 화면에 여러 개 겹쳐 보일 수 있기 때문에 깊이 표현도 필요했다. 이를 위해 Y값에 따라 Sort Order 를 변경하는 시스템을 구현했다. Y 위치 ↓ Depth 계산 ↓ Sorting Order 변경 이를 통해 화면에서 위쪽에 있는 오브젝트와 아래쪽에 있는 오브젝트가 자연스럽게 겹쳐 보이도록 만들었다. 현재는 BaseDepthSorter DynamicDepthSorter StaticDepthSorter 등으로 역할을 나누어 관리하고 있다. 8. GameManager와 게임 상태 게임 전체의 흐름은 GameManager 에서 관리한다. 현재 게임 상태는 크게 다음과 같이 구분했다. public enum GameState { Ready, Playing, GameOver } 게임이 시작되면 Playing 상태가 되고 제한 시간이 감소한다. 제한 시간이 0이 되면 게임을 종료하고 결과를 계산한다. 또한 스테이지 데이터와 현재 스테이지 인덱스를 연결하여 스테이지별 게임 설정을 사용할 수 있도록 했다. 이 구조를 통해 게임 플레이와 UI를 어느 정도 분리할 수 있었다. 9. 스테이지와 성장 시스템 게임의 반복 플레이를 만들기 위해 단순히 클로버를 찾는 것에서 끝내지 않고 성장 시스템을 추가했다. 현재 프로젝트에는 GrowthData 와 GrowthManager 를 중심으로 성장 시스템이 구성되어 있다. 성장을 통해 게임에서 얻을 수 있는 보상이나 플레이 효율을 높일 수 있도록 설계했다. 예를 들어 골드 획득량 증가와 같은 효과를 게임 플레이 결과에 적용할 수 있도록 했다. 게임 플레이 ↓ 스테이지 결과 ↓ 보상 계산 ↓ 성장 효과 적용 ↓ 최종 보상 이 구조를 만들면서 단순히 값을 증가시키는 것보다 보상 계산 과정에서 성장 효과를 연결하는 방식 을 고민하게 되었다. 10. 재화 시스템 게임 내 재화도 각각 별도의 Manager로 분리했다. 현재 주요 재화 시스템은 다음과 같다. Gold Gem Star HourGlass 각 재화는 별도의 Manager를 가지고 있으며 JSON을 이용해 저장한다. 예를 들어 Gold는 다음과 같은 데이터를 저장한다. [Serializable] public class GoldSaveData { public int totalGold; public string lastDailyRewardDate; public string lastAdResetDate; public int basicGoldAdCount; } 게임을 종료했다가 다시 실행해도 플레이어의 재화가 유지될 수 있도록 했다. 11. PlayerPrefs 대신 JSON 저장을 사용한 이유 FindClover에서는 주요 게임 데이터를 PlayerPrefs 보다는 JSON으로 저장하는 방향을 선택했다. 예를 들어 골드는 gold.json 능력 데이터는 ability.json 과 같은 방식으로 저장한다. JSON 저장을 사용하면 데이터 구조를 직접 정의할 수 있다는 장점이 있다. 특히 어빌리티 시스템처럼 Ability ID Count Upgrade Level 등 여러 데이터를 함께 저장해야 하는 경우 JSON 구조가 더 적합하다고 판단했다. 12. HourGlass 시스템 게임의 플레이 횟수 또는 플레이 자원 역할을 하는 HourGlass 시스템도 구현했다. 현재 기본 설정은 최대 보유량 : 5 회복 시간 : 8분 이다. 시간이 지나면 자동으로 회복되며, 게임을 실행하지 않은 동안에도 시간이 흐른 만큼 회복량을 계산한다. 마지막 회복 시간 ↓ 현재 시간과 비교 ↓ 경과 시간 계산 ↓ 회복 횟수 계산 ↓ HourGlass 증가 또한 광고 보상으로 HourGlass를 획득할 수 있고, 일정 시간 동안 무제한으로 사용할 수 있는 기능도 고려하여 구현했다. 13. 광고 시스템 모바일 게임이기 때문에 보상형 광고 시스템도 구현했다. Unity LevelPlay를 이용하여 광고 시스템을 구성했고, AdsManager 에서 광고 종류를 관리한다. 현재 코드에서는 다음과 같은 보상 종류를 관리하고 있다. FindClover EliminateObjects TimeExtend Revive GemAndGold BasicAbility RareAbility Gold Gem HourGlass 광고를 하나의 Manager에서 관리하고 광고 종류를 enum으로 구분하도록 구성했다. public enum AdRewardType { FindClover, EliminateObjects, TimeExtend, Revive, GemAndGold, BasicAbility, RareAbility, Gold, Gem, HourGlass } 개발 과정에서는 에디터에서 실제 광고를 기다리지 않고 테스트할 수 있도록 Mock Reward 방식도 사용했다. #if UNITY_EDITOR StartCoroutine(EditorMockReward(onRewarded)); return; #endif 덕분에 Unity Editor에서 광고 시청 과정을 빠르게 테스트할 수 있었다. 하지만 현재 완벽히 구현되진 않았다. 아직 테스팅 중이다. 14. 무료 보상과 일일 광고 제한 광고 시스템을 단순히 광고를 보여주는 기능으로 끝내지 않고 일일 제한과 무료 보상 시스템까지 연결했다. 예를 들어 골드의 경우 무료 일일 보상 ↓ 무료 보상 소진 ↓ 광고 보상 ↓ 일일 광고 제한 의 형태로 구성했다. 이 과정에서 날짜를 저장하고 다음 날이 되면 광고 횟수를 초기화하도록 구현했다. HourGlass와 Ability 시스템에도 비슷한 방식의 일일 광고 제한 구조를 적용했다. 15. Ability 시스템 현재 FindClover에서 가장 크게 확장하고 있는 부분이 Ability 시스템 이다. 초기 게임은 단순히 클로버를 찾는 구조였지만, 플레이를 반복할 이유를 만들기 위해 능력 시스템을 추가했다. 현재 AbilityManager 에서는 다음과 같은 데이터를 관리한다. Ability ID Ability Count Upgrade Level Ability Slot 그리고 플레이어의 어빌리티 데이터를 JSON으로 저장한다. 16. Ability 강화 구조 어빌리티는 동일한 능력을 여러 번 획득하여 강화하는 방식이다. 예를 들어 하나의 Ability가 여러 개 중복 획득되면 Count가 증가하고, 일정 개수 이상 모이면 Upgrade Level을 올릴 수 있다. 구조는 대략 다음과 같다. Ability 획득 ↓ Count 증가 ↓ 필요한 개수 충족 ↓ Upgrade ↓ Ability 효과 강화 최대 강화 레벨도 설정하여 무한히 성장하지 않도록 했다. 또한 Ability 효과는 Gold 획득량 증가와 같은 실제 게임 시스템과 연결했다. 17. Ability Box / Gacha 시스템 최근에는 Ability를 획득하는 방식으로 상자와 뽑기 시스템을 제작하고 있었다. 현재 구조에는 Basic Rare Epic Legendary 등의 등급이 존재한다. 확률표는 DrawProbabilityTable 이라는 ScriptableObject로 분리했다. [CreateAssetMenu(menuName = "Gacha/Draw Probability Table")] public class DrawProbabilityTable : ScriptableObject { public List<DrawLevelProbability> levels; } 이렇게 하면 코드에 확률을 직접 작성하는 대신 Unity Inspector에서 확률 데이터를 관리할 수 있다. 18. 뽑기 확률과 성장 단순한 고정 확률이 아니라 뽑기 레벨과 경험치를 함께 관리하도록 구현했다. 현재 AbilityManager에는 Rare Draw Level Legendary Draw Level Rare Draw EXP Legendary Draw EXP Rare Guarantee Legendary Guarantee 등의 데이터가 존재한다. 또한 일정 횟수마다 특정 등급 이상을 보장하는 천장 시스템도 구현하고 있다. 이를 통해 장기적으로 플레이할수록 뽑기 시스템 자체가 성장하도록 설계했다. 19. Ability Shop 제작 현재 개발의 마지막 단계에서는 Ability Shop을 제작하고 있다. ShopUI에서 구매 버튼을 누르면 구매 확인 팝업을 띄우고, 실제 구매가 진행되면 AbilityManager에서 뽑기를 실행하는 구조이다. 대략적인 흐름은 다음과 같다. ShopUI ↓ 구매 버튼 ↓ 구매 확인 Popup ↓ 재화 확인 ↓ AbilityManager ↓ Ability 추첨 ↓ 중복 처리 ↓ Ability 추가 ↓ JSON 저장 Basic / Rare / Legendary 등의 상자와 단일 구매 및 10회 구매를 연결하고 있다. 20. 개발 중 발견한 NullReferenceException Ability Shop을 구현하면서 중요한 문제도 발견했다. 구매 확정 버튼을 누르면 다음과 같은 오류가 발생했다. NullReferenceException: Object reference not set to an instance of an object AbilityManager.HandleDuplicate() AbilityManager.DrawBasicAbility() ShopUI.OnAbilityPurchaseButtonClicked() 처음에는 chestRarity 와 같은 값이 초기화되지 않은 문제를 의심했다. 하지만 실제 코드를 확인하면서 더 직접적인 원인을 찾을 수 있었다. GetRandomAbility() 는 해당 등급의 Ability가 하나도 없으면 null 을 반환한다. if (pool.Count == 0) return null; 그런데 이후 바로 HandleDuplicate(ability); 를 호출하고, HandleDuplicate() 내부에서 ability.abilityID 에 접근하고 있었다. 즉, GetRandomAbility() ↓ 해당 등급 Ability 없음 ↓ null 반환 ↓ HandleDuplicate(null) ↓ ability.abilityID 접근 ↓ NullReferenceException 이라는 흐름이었다. 이 문제를 통해 단순히 != null 체크를 어디에 추가할 것인가보다 null이 발생할 수 있는 데이터 흐름 자체를 먼저 확인해야 한다 는 것을 다시 확인했다. 21. 또 하나 확인한 구매 구조의 문제 Ability 구매 과정에서는 중복으로 Ability를 추가할 가능성도 확인했다. 현재 구매 과정에서 DrawBasicAbility() ├─ HandleDuplicate() └─ AddAbility() 가 실행되는 동시에 Shop의 다른 구매 처리에서도 AddAbility() 가 호출될 가능성이 있었다. 이 경우 한 번 구매했는데 Ability Count가 두 번 증가하는 문제가 발생할 수 있다. 따라서 현재는 단순히 오류 하나를 고치는 것뿐만 아니라, Ability를 실제로 획득하는 책임을 어디에서 담당할 것인지 를 다시 정리할 필요가 있는 상태이다. 22. 현재 프로젝트 구조 현재 Assets/Scripts 기준으로 보면 프로젝트가 상당히 여러 영역으로 분리되어 있다. Scripts ├─ Ability │ └─ AbilityData │ ├─ Clover │ └─ Clover │ ├─ Controll │ ├─ TouchController │ ├─ CameraJoystickMove │ └─ CameraMultiTouchMove │ ├─ Global │ ├─ BaseDepthSorter │ ├─ DynamicDepthSorter │ └─ StaticDepthSorter │ ├─ Growth │ └─ GrowthData │ ├─ Level │ └─ LevelData │ ├─ Manager │ ├─ GameManager │ ├─ CloverManager │ ├─ SpawnManager │ ├─ TouchManager │ ├─ AbilityManager │ ├─ GrowthManager │ ├─ GoldManager │ ├─ GemManager │ ├─ StarManager │ ├─ HourGlassManager │ ├─ AdsManager │ ├─ SoundManager │ ├─ HapticManager │ └─ UIManager │ ├─ Shop │ └─ DrawProbabilityTable │ └─ UI ├─ InGameUI ├─ GameEndUI ├─ ShopUI ├─ AbilityUI ├─ GrowthUI ├─ InventoryUI └─ ... 처음에는 하나의 게임을 만드는 것이 목적이었지만, 현재는 게임의 각 기능을 별도의 Manager와 Data 구조로 분리하는 형태로 발전했다. 23. 현재까지 개발하면서 배운 점 이번 프로젝트에서 가장 크게 느낀 점은 게임의 기능을 구현하는 것과 게임 시스템을 설계하는 것은 다른 문제 라는 것이다. 처음에는 클로버를 생성하고 터치하면 된다. 라고 생각했다. 하지만 실제로 개발해보니 다음과 같은 문제가 계속 추가되었다. 클로버 생성 ↓ 터치 판정 ↓ 모바일 UX ↓ 좌표계 ↓ 스테이지 ↓ 보상 ↓ 재화 ↓ 저장 ↓ 성장 ↓ 광고 ↓ Ability ↓ Shop ↓ Gacha 하나의 기능이 추가될 때마다 기존 시스템과 연결해야 했다. 특히 Manager가 많아지면서 어떤 시스템이 어떤 시스템의 데이터를 변경해야 하는지 가 중요해졌다. 24. 현재 FindClover의 상태 현재까지 구현된 시스템을 정리하면 다음과 같다. 게임 기본 시스템 클로버 생성 세잎 / 네잎클로버 구분 터치 입력 드래그 Depth Sorting 스테이지 제한 시간 게임 시작 / 종료 Pause Game End UI Title Option InGame UI Pause UI Game End UI Inventory Growth Shop Ability UI 재화 Gold Gem Star HourGlass 성장 Growth System Ability System Ability Upgrade Ability Slot 저장 JSON Save / Load 일일 보상 날짜 저장 광고 횟수 저장 Ability 데이터 저장 HourGlass 회복 시간 저장 광고 LevelPlay 보상형 광고 무료 보상 일일 광고 제한 Ability 광고 구매 Gold / Gem / HourGlass 광고 보상 상점 재화 구매 Ability Box 단일 구매 10회 구매 등급별 확률 뽑기 레벨 경험치 천장 시스템 까지 구현한 상태이다. 25. 앞으로 해결해야 할 부분 현재 가장 먼저 해결해야 하는 것은 Ability Shop의 구매 흐름이다. 특히 1. null Ability 처리 2. Ability 중복 획득 처리 3. 구매 → 추첨 → 저장 흐름 정리 4. 1회 / 10회 구매 로직 통합 5. 광고 구매와 일반 구매 로직 통합 을 우선적으로 정리할 예정이다. 그 이후에는 실제 모바일 환경에서의 테스트를 중심으로 진행할 필요가 있다. 특히 터치 판정과 UI 크기, 광고 보상, 저장 데이터, 앱 종료 후 데이터 복구 등을 실제 Android 환경에서 계속 확인할 예정이다. 마무리 FindClover는 처음에는 단순한 2D 클로버 찾기 게임 으로 시작했다. 하지만 지금은 게임 플레이 → 보상 → 재화 → 성장 → 능력 → 상점 → 뽑기 로 이어지는 하나의 게임 시스템을 갖추는 단계까지 발전했다. 이번 프로젝트에서 가장 의미 있었던 부분은 단순히 기능을 많이 구현했다는 것이 아니다. 처음에는 기능 하
인스턴스에 접속하려고 인터넷 전체에 SSH를 열어 놓으면 관리가 끝난 뒤에도 진입점이 남을 수 있습니다. 한편 웹 애플리케이션이 임의 URL을 요청하는 취약점은 관리 포트와 다른 경로로 인스턴스 정보를 노립니다. EC2 하드닝에서는 관리자의 접속 경로와 애플리케이션의 메타데이터 접근 을 따로 점검하겠습니다. 기존 AWS 시리즈 에서 서비스별 역할을 정리한 데 이어, 이번에는 정상 업무를 유지하면서 접근 범위를 줄이는 방법을 살펴봅니다. EC2, 보안 그룹, IAM 역할을 알고 있다는 전제입니다. 이번 예제는 일반 EC2 VM을 대상으로 하며 컨테이너의 모든 네트워크 형태를 포괄하지 않습니다. IMDS에는 무엇이 있나요? 인스턴스 메타데이터 서비스인 IMDS는 실행 중인 인스턴스가 자신의 정보를 조회하는 경로입니다. 인스턴스 역할의 임시 자격 증명도 이 경로와 관련됩니다. IMDSv2는 먼저 세션 토큰을 받은 뒤 그 토큰을 포함해 조회합니다. 인스턴스에서 토큰 사용을 required 로 설정하면 IMDSv1 방식은 사용할 수 없습니다. IMDSv2 동작 서버 측 요청 위조인 SSRF는 서버가 공격자가 유도한 주소로 요청하는 문제입니다. IMDSv2는 이 문제에 대한 방어를 보강하지만, 애플리케이션의 임의 URL 요청 취약점을 없애 주지는 않습니다. 대상 URL 제한, 리디렉션 처리, 인스턴스 역할의 최소 권한도 따로 검토합니다. 두 경로를 나눠 읽어 주세요. Session Manager를 사용했다고 IMDSv2가 자동 필수로 바뀌는 것은 아닙니다. IMDSv2를 필수로 해도 SSH 포트가 저절로 닫히지 않습니다. 메타데이터 옵션의 작은 예제 아래는 CloudFormation LaunchTemplate의 LaunchTemplateData 안에 넣는 속성 조각 입니다. 전체 인스턴스를 만드는 템플릿이 아닙니다. { "MetadataOptions": { "HttpEndpoint": "enabled", "HttpTokens": "required", "HttpPutResponseHopLimit": 1, "InstanceMetadataTags": "disabled" } } HttpTokens: required 가 IMDSv2 필수 설정입니다. 홉 제한은 응답이 이동할 수 있는 네트워크 홉에 관한 설정입니다. 일반 VM 예제에서는 1로 두었지만, 컨테이너 환경에서 이 값을 무조건 적용하면 필요한 메타데이터 요청이 실패할 수 있습니다. 실제 네트워크 구조와 사용 중인 SDK를 확인해야 합니다. MetadataOptions 필드 메타데이터 자체가 전혀 필요 없다면 엔드포인트 비활성화도 검토할 수 있습니다. 하지만 역할 자격 증명을 가져오는 SDK나 운영 도구의 의존성을 확인하지 않고 끄면 정상 작업을 막을 수 있습니다. 태그 공개 옵션 역시 태그 안에 비밀을 넣지 않는 원칙을 대신하지 않습니다. 관리 접속을 바꾸는 순서 Session Manager는 인바운드 관리 포트를 열지 않는 관리 경로를 제공합니다. 사용하려면 SSM Agent, 인스턴스와 운영자 IAM 권한, Systems Manager 서비스까지의 통신 경로를 준비해야 합니다. 인터넷 출구를 제거한 프라이빗 환경이라면 필요한 서비스 엔드포인트와 DNS도 확인합니다. Session Manager 개요 SSH를 먼저 닫고 새 경로를 준비하면 장애 때 접근할 수 없습니다. 테스트 인스턴스에서 접속, 권한 거부, 접속 종료, 감사 기록을 먼저 확인한 뒤 기존 인바운드 규칙을 줄입니다. 관리자의 세션 시작 권한도 모든 인스턴스가 아닌 업무 대상에 맞춥니다. 세션 내용을 항상 녹화한다고 생각하는 것도 위험합니다. SSH 방식이나 포트 포워딩 세션 등은 Session Manager의 세션 콘텐츠 로깅에 제한이 있습니다. 시작·종료 이력과 명령 내용 기록을 구분해 필요한 감사 범위를 설계해야 합니다. 이 글에서는 실제 세션 로깅을 시험하지 않았습니다. 세션 로그의 제한 변경 뒤 확인할 항목 SDK와 운영 도구가 IMDSv2를 지원하는지 확인합니다. 새 인스턴스뿐 아니라 현재 인스턴스의 메타데이터 옵션도 확인합니다. LaunchTemplate 수정이 기존 VM을 자동 변경했다고 가정하지 않습니다. 테스트 대상에서 토큰 없는 요청이 거부되고 정상 애플리케이션이 계속 동작하는지 확인합니다. 자격 증명 응답을 로그에 남기지 않습니다. 새 관리 경로가 동작한 뒤에 넓은 SSH 인바운드를 제거합니다. 되돌릴 경우에는 영향을 받은 옵션이나 관리 규칙만 검토된 이전 상태로 복구합니다. 전체 인터넷에 관리 포트를 여는 자동 원복을 피하고, 사전에 승인된 복구 경로를 사용합니다. IMDSv1 의존 도구가 발견됐다면 임시 예외의 대상과 종료 시점을 기록합니다. 로컬 검증: JSON 구문, IMDSv2 필수, VM 예제 홉 제한을 검사했습니다. HttpTokens 를 optional 로 바꾼 반례는 학습용 기준에서 탈락했습니다. 실제 EC2 요청, SSRF 방어 효과, Session Manager 접속과 감사 로그는 시험하지 않았습니다. 확인 문제 IMDSv2를 켜면 SSH가 자동으로 닫힐까요? 홉 제한 1을 모든 컨테이너 환경에 적용해도 될까요? 관리 포트를 없애기 전에 무엇을 확인해야 할까요? 답과 해설 아닙니다. 메타데이터와 관리 접속은 별개입니다. 아닙니다. 네트워크 홉과 SDK 의존성을 확인해야 합니다. Agent, IAM, 서비스 통신, 실제 새 관리 접속과 승인된 복구 경로입니다. 복습 오늘은 두 접근 경로를 나눠 그려 보세요. 내일은 기존 VM과 새 VM 중 어디에 설정이 적용됐는지 확인하는 질문을 써 보세요. 일주일 뒤에는 애플리케이션 역할을 줄이는 것이 SSRF의 피해에 어떤 영향을 주는지 설명해 보세요. 확인일: 2026-10-04, 한국 시간 . EC2 IMDSv2, CloudFormation LaunchTemplate, Systems Manager Session Manager 기준입니다.
관리 콘솔에 들어갈 수 있다는 것과, 매일 최고 권한으로 일해야 한다는 것은 다른 문제입니다. 배포 담당자에게 루트 계정이나 장기 액세스 키를 나눠 주면 업무가 끝난 뒤에도 같은 비밀이 남습니다. 이번 글에서는 누가 로그인하는지, 어떤 역할을 맡는지, 언제 권한이 끝나는지 를 분리해 보겠습니다. AWS 계정과 IAM 역할의 이름 정도를 알고 있으면 읽을 수 있습니다. 기존 AWS 시리즈 가 서비스 연결을 살펴봤다면, 여기서는 그 연결을 시작하는 사람의 접근부터 좁힙니다. 사람의 로그인과 프로그램의 로그인 사람은 IAM Identity Center나 외부 자격 증명 공급자를 통한 연동 로그인을 사용하고, 필요한 계정의 역할로 임시 자격 증명을 받는 흐름을 검토합니다. 프로그램은 사람이 쓰던 키를 복사하기보다 실행 환경에 맞는 IAM 역할을 사용합니다. 둘 다 장기 비밀을 줄이는 방향이지만 인증 방법까지 동일한 것은 아닙니다. IAM 보안 권장 사항 MFA는 다중 요소 인증입니다. 비밀번호만 알아서는 로그인할 수 없게 하는 추가 장치입니다. Identity Center의 자격 증명 원본이 무엇인지에 따라 MFA 설정 위치를 확인해야 합니다. 외부 IdP를 쓰면서 다른 화면의 MFA 체크만 켰다고 실제 사람의 로그인에 적용됐다고 판단하면 안 됩니다. 그림의 마지막 칸은 권한이 영구 저장되는 지점이 아닙니다. 역할 세션에는 수명이 있습니다. 다만 이미 발급된 세션의 처리와 새 로그인 차단은 별도로 확인해야 합니다. 계정 할당을 없앴다는 이유만으로 모든 세션이 즉시 끝났다고 가정하지 않습니다. 한 시간짜리 조회 역할의 예 아래 JSON은 CloudFormation의 AWS::SSO::PermissionSet 리소스 조각 입니다. 가상 ARN이며 배포용 전체 템플릿이 아닙니다. 실제 Identity Center 인스턴스, 사용자·그룹의 계정 할당, MFA 설정은 포함하지 않았습니다. { "Type": "AWS::SSO::PermissionSet", "Properties": { "InstanceArn": "arn:aws:sso:::instance/ssoins-0123456789abcdef", "Name": "StudyEc2Inventory", "SessionDuration": "PT1H", "InlinePolicy": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["ec2:DescribeInstances"], "Resource": "*" }] } } } PT1H 는 ISO 8601 형식의 한 시간입니다. 정책은 EC2 인스턴스 목록 조회만 예로 들었습니다. 이 조회 API는 리소스별 ARN으로 제한하는 방식이 지원되지 않아 Resource 가 * 입니다. 모든 작업을 허용하는 Action: "*" 와는 뜻이 다릅니다. 정책을 읽을 때 별표 하나만 보고 판단하기보다 작업별 지원 범위를 확인해야 합니다. PermissionSet 필드 , EC2 조회 권한의 리소스 제한 이 조각에는 MFA 조건이 없습니다. PermissionSet의 세션 시간 설정이 MFA 설정을 대신하지도 않습니다. 세션이 짧아져도 허용한 작업 자체가 줄어드는 것은 아니므로, 권한 범위와 세션 시간은 따로 검토합니다. 루트 계정은 비상 절차까지 함께 루트 계정은 일반 배포 계정으로 사용하지 않고, 루트가 필요한 작업의 절차를 분리합니다. 루트 액세스 키를 만들지 않고, MFA와 계정 복구 수단을 보호합니다. Organizations의 멤버 계정에서는 중앙 루트 접근 관리가 가능한 구성도 있지만, 독립 계정이나 관리 계정에 같은 절차를 그대로 적용할 수 있다고 가정하면 안 됩니다. 루트 사용자 보호 지침 운영 설계로는 비상 접근 담당자, 승인 방법, 사용 기록, 복구 수단을 정합니다. 정상 IdP가 장애일 때 필요한 경로까지 끊어 놓으면 보안 설정을 되돌릴 사람도 없어질 수 있습니다. 그렇다고 모두에게 상시 관리자 권한을 주는 방식으로 해결하지 않습니다. 적용·확인·되돌리기 현재 사람 계정, 장기 키 사용처, 루트 사용 이유를 목록으로 만듭니다. 비밀 값은 목록에 쓰지 않습니다. 테스트 계정에서 조회 역할을 할당하고 새 로그인에 MFA가 요구되는지 확인합니다. 인스턴스 조회는 성공하는지 확인합니다. 종료 권한 검사는 해당 API의 DryRun 으로 먼저 확인하고 실제 인스턴스를 종료하지 않습니다. 세션 만료 뒤 재인증도 별도 확인합니다. 기존 접근을 제거하기 전에 다른 승인된 관리 경로로 로그인할 수 있는지 점검합니다. 되돌릴 때는 변경한 할당이나 세션 설정을 검토된 이전 상태로 돌립니다. 장기 키를 다시 배포하는 것을 자동 복구 절차로 만들지 않습니다. 탈취된 자격 증명이라면 단순 원복보다 세션 처리와 사고 대응이 우선입니다. 로컬 검증: JSON 구문, 한 시간 세션, 조회 작업만 포함한 조건을 검사했습니다. 세션을 12시간으로 바꾼 반례가 학습용 기준에서 탈락하는 것도 확인했습니다. 실제 로그인, MFA 강제, STS 만료와 AWS 권한 평가는 실행하지 않았습니다. 확인 문제 MFA를 켜면 관리자 권한이 읽기 전용으로 바뀔까요? SessionDuration 을 줄이면 장기 액세스 키가 자동 삭제될까요? IdP 장애에 대비하는 절차에는 어떤 항목을 넣어야 할까요? 답과 해설 아닙니다. MFA는 인증을 보강하고, 허용 작업은 정책이 결정합니다. 아닙니다. 역할 세션 설정과 기존 키 수명은 별도입니다. 승인된 비상 신원, 접근 승인, 복구 수단, 사용 기록, 종료 후 권한 회수 방법입니다. 직접 로그인 검증도 필요합니다. 다시 공부하기 오늘은 사람과 워크로드의 로그인 경로를 따로 그려 보세요. 내일은 예제 역할이 조회만 할 수 있는지 정책을 읽어 보세요. 일주일 뒤에는 MFA와 최소 권한이 각각 막는 문제를 설명해 보세요. 권장 복습 순서이며 자동 알림은 아닙니다. 문서 확인일: 2026-10-04, 한국 시간 . 예제 기준은 IAM Identity Center PermissionSet과 IAM 정책 2012-10-17 입니다. 다음 학습 목표는 역할의 신뢰 정책과 실제 작업 권한을 구분하는 것입니다.