13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] MFA

  • [Cloud] Zero Trust 아키텍처 도입 시 고려사항 및 보안 강화 전략

    [Cloud] Zero Trust 아키텍처 도입 시 고려사항 및 보안 강화 전략

    [인프라] Zero Trust 아키텍처 도입 시 고려사항 및 보안 강화 전략

    안녕하세요, 13년차 서버실 지킴이 ’13년차의 서버실’입니다. 오늘은 인프라 보안의 새로운 패러다임, Zero Trust 아키텍처에 대한 이야기를 해볼까 합니다.

    제가 처음 인프라 업무를 시작했을 때만 해도 보안은 흔히 ‘성벽과 해자(Moat and Castle)’ 모델이 대세였죠. 회사 내부망은 안전하고, 외부 위협만 잘 막으면 된다는 생각이었거든요. 그런데 클라우드 도입이 가속화되고, 원격 근무가 일상화되면서 이 경계가 무너져 버렸죠. 더 이상 ‘내부’라는 개념 자체가 모호해진 겁니다. 이로 인해 클라우드 보안의 새로운 패러다임이 필요해졌거든요. 저도 처음엔 ‘이게 뭔가’ 싶었는데, 직접 홈랩에 이것저것 적용해보면서 결국 Zero Trust가 답이라는 걸 깨달았습니다.

    혹시 아직도 ‘우리 회사 내부망은 안전할 거야’라고 막연히 믿고 계신가요? 그렇다면 지금이 바로 Zero Trust(제로 트러스트)를 고민해볼 때입니다. 저와 함께 Zero Trust 아키텍처의 핵심과 실전 도입 전략, 그리고 제가 겪었던 삽질 경험까지 솔직하게 공유해볼게요.

    Zero Trust 아키텍처의 핵심 원칙과 구성 요소를 보여주는 개요 다이어그램

    Zero Trust 아키텍처의 핵심 개념을 시각적으로 보여주는 다이어그램입니다. 모든 요소가 신뢰 없이 검증되는 과정을 나타냅니다.

    Zero Trust, 도대체 뭘까요? (쉽게 말해!)

    Zero Trust(제로 트러스트)는 말 그대로 ‘아무것도 신뢰하지 않는다(Never Trust)’는 원칙에서 시작합니다. 기존 보안 모델이 ‘내부는 안전하다’고 가정한 것과 달리, Zero Trust는 사용자, 디바이스, 애플리케이션 등 모든 접근 요청을 잠재적 위협으로 간주하고 항상 검증(Always Verify)하는 것이 핵심입니다. 쉽게 말해, ‘너 누구니? 뭘 하려 하니? 정말 해도 되는 거니?’ 하고 매번 꼼꼼히 물어보고 확인하는 방식이라고 보시면 되죠.

    Zero Trust의 세 가지 핵심 원칙은 다음과 같습니다.

    • 모든 트래픽은 신뢰할 수 없다 (Never Trust, Always Verify): 내부망이든 외부망이든 모든 트래픽을 의심하고 검증합니다.
    • 최소 권한 원칙 (Least Privilege): 사용자나 시스템에 필요한 최소한의 권한만 부여하고, 권한이 필요한 순간에만 잠시 허용합니다.
    • 침해는 항상 발생한다고 가정 (Assume Breach): 아무리 잘 막아도 언젠가는 뚫릴 수 있다는 전제하에, 침해 발생 시 피해를 최소화하고 빠르게 탐지/대응하는 데 집중합니다.

    실전 구현: Zero Trust 핵심 요소와 적용 전략

    Zero Trust를 도입하려면 여러 요소들을 유기적으로 결합해야 합니다. 제가 홈랩이나 회사에서 고민하고 적용했던 방법들을 바탕으로 설명해 드릴게요.

    1. 강력한 ID 및 접근 관리 (IAM, Identity and Access Management)

    가장 기본 중의 기본입니다. 모든 접근의 주체인 사용자와 디바이스를 확실하게 식별하고 인증해야 하거든요. 특히 MFA (Multi-Factor Authentication, 다단계 인증)는 이제 선택이 아닌 필수입니다. 비밀번호 하나만으로는 너무 취약하잖아요?

    저는 오픈소스 Keycloak (키클록)을 활용해서 MFA를 강제한 경험이 있습니다. 처음엔 사용자들의 반발도 좀 있었는데, 보안 사고 한 번 겪고 나니 다들 군말 없이 따르더라고요. Keycloak에서 사용자가 로그인할 때 OTP 앱 같은 두 번째 인증 요소를 요구하도록 설정할 수 있어요.

    예를 들어, 특정 클라이언트에 대해 MFA를 강제하려면 Keycloak 관리 콘솔에서 Realm(영역) 설정의 Authentication(인증) 탭에서 Flow를 조정하거나, 클라이언트별로 Required Actions(필수 작업)을 설정할 수 있습니다. CLI로도 가능하죠.

    
    # Keycloak Admin CLI를 사용하여 특정 Realm의 Required Action 확인 및 추가
    # (Keycloak 버전 및 설정에 따라 명령어가 다를 수 있습니다. 예시입니다.)
    
    # realm-name을 실제 Realm 이름으로 변경하세요.
    REALM_NAME="my-zero-trust-realm"
    
    # 현재 Realm의 모든 Required Actions 목록 확인
    ./kcadm.sh get realms/$REALM_NAME -r --fields requiredActions
    
    # 'configure OTP'를 필수 작업으로 추가 (이미 있다면 건너뜜)
    # 실제 운영 환경에서는 단계별 플로우를 더 정교하게 구성해야 합니다.
    ./kcadm.sh update realms/$REALM_NAME -s 'requiredActions=[{"alias":"configure_otp","name":"Configure OTP","providerId":"kc-otp-setup","enabled":true,"defaultAction":true,"priority":10,"config":{}}]'
    
    echo "MFA(OTP) 설정이 필수 작업으로 추가되었습니다. 사용자는 다음 로그인 시 OTP 설정을 요구받을 것입니다."
    

    이렇게 설정하면 사용자는 로그인 후 OTP 설정을 완료해야만 서비스에 접근할 수 있게 됩니다. 처음에 좀 번거로워도 보안에 훨씬 유리하죠. SSO (Single Sign-On, 단일 로그인)를 함께 구축하면 사용자 경험도 크게 해치지 않으면서 보안을 강화할 수 있죠.

    2. 마이크로 세그멘테이션 (Micro-segmentation)

    네트워크를 아주 작게 쪼개서 각 워크로드나 서비스 간의 통신까지도 제어하는 방식입니다. 기존에는 ‘사내망’이라는 큰 덩어리로 관리했다면, 마이크로 세그멘테이션은 ‘웹 서버는 DB 서버랑만 통신하고, 개발 서버는 운영 DB에 접근 못하게’ 같은 아주 세밀한 정책을 적용하는 거죠. 침해 사고 발생 시 피해 확산을 막는 데 아주 효과적입니다.

    특히 Kubernetes (쿠버네티스) 환경에서는 Network Policy (네트워크 정책)를 활용해서 쉽게 마이크로 세그멘테이션을 구현할 수 있습니다. 처음엔 좀 헷갈렸는데, 몇 번 해보니 그리 어렵지 않더라고요.

    Kubernetes 환경에서 마이크로 세그멘테이션이 어떻게 동작하는지 보여주는 다이어그램입니다. 각 네임스페이스 간의 트래픽 흐름을 제어하는 모습을 나타냅니다.

    
    # Kubernetes Network Policy 예시: frontend 파드가 backend 파드로만 접근 허용
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-frontend-to-backend
      namespace: default # 정책을 적용할 네임스페이스
    spec:
      podSelector:
        matchLabels:
          app: backend # 이 정책이 적용될 파드 (backend 앱을 가진 파드)
      policyTypes:
        - Ingress # Ingress(인그레스, 외부 -> 내부) 트래픽에 대한 정책
      ingress:
        - from:
            - podSelector:
                matchLabels:
                  app: frontend # frontend 앱을 가진 파드로부터의 트래픽만 허용
          ports:
            - protocol: TCP
              port: 8080 # backend 파드의 8080 포트로만 접근 허용
    
    ---
    
    # Kubernetes Network Policy 예시: 모든 outbound 트래픽 기본 차단 (default deny egress)
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: default-deny-egress
      namespace: default
    spec:
      podSelector: {}
      policyTypes:
        - Egress # Egress(이그레스, 내부 -> 외부) 트래픽에 대한 정책
      egress: [] # 아무런 egress 룰도 없으므로, 모든 outbound 트래픽이 차단됩니다.
    

    위 예시처럼 `NetworkPolicy`를 사용하면 `frontend` 파드만이 `backend` 파드의 특정 포트로 접근하게 하고, 다른 파드들은 접근하지 못하게 할 수 있습니다. 두 번째 정책은 해당 네임스페이스의 모든 파드가 외부로 나가는 트래픽을 기본적으로 차단하는 설정입니다. 필요한 아웃바운드(Outbound) 통신만 명시적으로 허용해야겠죠. 이러한 정책을 통해 불필요한 통신 경로를 차단하고 공격 표면(Attack Surface)을 최소화할 수 있습니다.

    3. 엔드포인트 보안 및 가시성 (Endpoint Security & Visibility)

    사용자가 사용하는 노트북, 모바일 기기 같은 엔드포인트(Endpoint) 역시 Zero Trust의 중요한 요소입니다. 이 디바이스들이 안전한지, 최신 보안 패치가 적용되어 있는지, 악성코드는 없는지 지속적으로 확인해야 합니다. EDR (Endpoint Detection and Response) 솔루션이나 디바이스 Posture Check (자세 확인) 기능이 필수적이죠. 저는 홈랩에서 오픈소스 솔루션들을 조합해서 대략적인 Posture Check를 구현해본 적이 있는데, 상용 솔루션만큼 강력하진 않아도 기본적인 보안 수준을 높이는 데는 도움이 되더라고요.

    4. SDP (Software-Defined Perimeter, 소프트웨어 정의 경계)

    SDP는 사용자가 접근하려는 애플리케이션에 직접 연결시켜주고, 불필요한 네트워크 노출을 최소화하는 개념입니다. 마치 보이지 않는 네트워크 터널을 만들어서 인가된 사용자만 접근하게 하는 방식이죠. VPN(Virtual Private Network)과 비슷하지만, 더 세밀한 접근 제어가 가능하고, ‘연결 전 인증’을 통해 네트워크 자체를 숨기는 효과가 있습니다. 클라우드 환경에서 특히 유용합니다.

    ⚠️ 주의사항 및 트러블슈팅: 제가 겪은 ‘삽질’ 경험

    Zero Trust를 도입하면서 마냥 좋기만 했던 건 아닙니다. 저도 꽤 많은 삽질을 했거든요. 몇 가지 대표적인 경험을 공유해 드릴게요.

    1. 너무 강한 초기 정책 설정으로 인한 서비스 장애

    처음엔 ‘모든 것을 차단하고 필요한 것만 열자!’라는 생각에 너무 빡빡하게 정책을 잡았습니다. 그랬더니 개발자들이 ‘왜 우리 서비스가 통신이 안 되냐’며 난리가 났던 적이 있어요. 특정 마이크로서비스 간의 통신이 막혀서 장애가 발생한 거죠. 🤦‍♂️

    해결 과정: 급하게 정책을 풀고, 시스템 로그를 꼼꼼히 분석하기 시작했습니다. 특히 네트워크 보안 장비의 `audit log`나 `syslog`를 확인해서 어떤 트래픽이 차단되었는지, 소스와 목적지가 어디인지 파악하는 게 중요하죠. Kubernetes 환경에서는 `kubectl logs`로 파드 로그를 보고, `NetworkPolicy` 관련 이벤트를 확인했죠. 만약 로그에서 `DROP`이나 `DENY` 관련 메시지가 특정 IP 주소나 포트에서 지속적으로 보인다면, 해당 통신이 정책에 의해 차단되고 있다는 의미이니, 서비스 요구사항에 맞춰 정책을 조정해야 합니다. 너무 급하게 하지 마시고, 테스트 환경에서 충분히 검증하는 시간을 가져야 합니다.

    2. 레거시 시스템과의 연동 문제

    Zero Trust를 도입하려다 보니, 오래된 사내 시스템 중에는 MFA나 SSO를 지원하지 않는 경우가 많더라고요. 이런 시스템들은 IDP와 직접 연동하기가 어려워서 골머리를 앓았죠. 😩

    해결 과정: 이런 경우에는 프록시(Proxy)나 API 게이트웨이(Gateway)를 도입해서 인증 과정을 중간에서 처리하는 방식으로 우회했습니다. 예를 들어, Nginx의 `auth_request` 모듈을 활용해서 Keycloak과 같은 IDP로 인증 요청을 보낸 후, 인증이 성공하면 실제 백엔드 레거시 시스템으로 트래픽을 포워딩하는 방식이죠. 초기 설정이 좀 복잡하지만, 한 번 구축해두면 레거시 시스템도 Zero Trust 환경에 포함시킬 수 있습니다.

    3. 성능 저하 및 관리 복잡도 증가

    모든 트래픽을 검증하고, 세밀한 정책을 적용하다 보니 초기에는 네트워크 지연 시간(Latency)이 늘어나거나, 정책 관리 자체가 너무 복잡해지는 문제가 발생하기도 했습니다. ‘이러다 배보다 배꼽이 더 커지는 거 아니야?’ 하는 걱정도 들었죠. 😥

    해결 과정: 성능 문제는 정책 최적화와 함께 전용 보안 솔루션을 도입하면서 해결했습니다. 하드웨어 기반의 보안 장비나 클라우드 네이티브 보안 서비스를 활용하면 정책 검증에 드는 오버헤드를 줄일 수 있습니다. 관리 복잡도는 정책 자동화 도구나 중앙 집중식 정책 관리 플랫폼을 도입해서 해결해나갔죠. 처음부터 완벽하게 하려기보다, 핵심 시스템부터 점진적으로 적용하고 경험을 쌓아가는 것이 중요합니다.

    ✅ 검증 및 결과: Zero Trust 도입 후 달라진 점

    이런 삽질을 거쳐 Zero Trust 아키텍처를 도입하고 나니, 확실히 보안 수준이 한 단계 높아졌다는 걸 체감할 수 있었습니다. 가장 크게 체감한 건 공격 표면(Attack Surface) 감소와 위협 탐지율 증가였어요. 예전에는 내부망에 들어오면 끝이었지만, 이제는 모든 접근이 검증되니 마음이 한결 놓이더라고요.

    저희 팀에서는 Zero Trust 도입 후 다음과 같은 지표들을 꾸준히 모니터링하면서 관리하고 있습니다.

    • MFA 적용률: 전체 사용자 중 MFA를 사용하는 비율. (높을수록 좋음)
    • 정책 위반(Policy Violation) 로그 수: 허용되지 않은 접근 시도 및 차단 횟수. (낮을수록 좋지만, 너무 낮으면 정책이 느슨한 것일 수도 있어 분석 필요)
    • 엔드포인트 보안 점수: 디바이스의 보안 패치 상태, 악성코드 유무 등을 종합한 점수. (높을수록 좋음)
    • 세션당 평균 권한 지속 시간: 최소 권한 원칙이 잘 지켜지는지 확인. (짧을수록 좋음)
    Zero Trust 도입 후 주요 보안 지표를 모니터링하는 대시보드

    Zero Trust 도입 후 보안 수준을 측정하고 모니터링하는 대시보드 예시입니다. 주요 지표들을 한눈에 확인할 수 있습니다.

    마무리: Zero Trust는 여정입니다

    Zero Trust 아키텍처는 한 번에 뚝딱 완성되는 것이 아니라, 지속적인 개선과 노력이 필요한 ‘여정(Journey)’이라고 생각합니다. 기술적인 도입뿐만 아니라, 조직의 보안 문화와 프로세스를 함께 변화시켜야 성공할 수 있거든요.

    어떤 솔루션을 선택해야 할지 고민이 많으실 텐데요, 우리 조직의 규모와 예산, 그리고 기존 인프라 환경에 따라 최적의 선택은 달라질 수 있습니다. 제가 간단한 비교표를 준비해봤어요.

    구분 오픈소스/클라우드 네이티브 상용 솔루션
    장점
    • 비용 효율적
    • 높은 유연성과 커스터마이징 가능
    • 클라우드 환경에 최적화
    • 통합된 기능과 관리 용이성
    • 전문적인 기술 지원
    • 빠른 구축 및 안정성
    단점
    • 구축 및 관리에 기술적 역량 요구
    • 기능 조합 시 복잡도 증가
    • 레거시 시스템 연동 어려움
    • 높은 도입 비용
    • 벤더 종속성 발생 가능
    • 커스터마이징의 한계
    추천 대상
    • 작은 규모의 조직/스타트업
    • 클라우드 중심의 인프라
    • 내부 기술 역량 충분한 경우
    • 대규모 조직 또는 규제 산업
    • 빠르고 안정적인 구축 필요한 경우
    • 기술 지원이 필수적인 경우

    만약 작은 규모의 조직이거나 클라우드 환경에 익숙하다면, Keycloak 같은 오픈소스 IDP와 각 클라우드 벤더(AWS, Azure, GCP 등)의 보안 서비스(예: AWS IAM, Security Groups, Network ACLs, Azure Active Directory, Google Cloud Identity)를 조합하여 시작하는 것을 추천합니다. 반면, 규제가 엄격하거나 인프라 규모가 큰 경우에는 통합적인 기능을 제공하는 상용 Zero Trust 솔루션이 더 유리할 수 있습니다.

    어떤 선택이든 중요한 것은 점진적인 접근입니다. 모든 것을 한 번에 바꾸려 하지 말고, 가장 핵심적인 시스템부터 Zero Trust 원칙을 적용하고, 점차 범위를 넓혀 나가는 전략이 성공 확률을 높일 수 있을 거예요. 저도 그렇게 해왔고요.

    Zero Trust 솔루션 선택을 위한 오픈소스, 클라우드 네이티브, 상용 솔루션 비교표

    Zero Trust 솔루션 선택 시 고려할 수 있는 다양한 옵션들을 비교한 개념표입니다.

    다음번에는 특정 Zero Trust 솔루션을 저희 홈랩에서 직접 구축하고 연동하는 과정에 대해 더 자세히 다뤄볼게요. 그때까지 여러분의 서버실도 항상 안전하길 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 남겨주세요.

  • [보안] YubiKey 1년 사용 후기: 피싱 공격 방어, 정말 효과적일까?

    [보안] YubiKey 1년 사용 후기: 피싱 공격 방어, 정말 효과적일까?

    [보안] YubiKey 사용 후기: 1년 써보니 피싱 방어에 얼마나 도움됐나

    YubiKey 사용 후기를 찾는 분들은 보통 비슷한 고민을 하시더라고요. 비밀번호(Password)만으로는 불안하고, 문자 인증 SMS MFA도 찜찜한데, 그렇다고 하드웨어 보안 키(Hardware Security Key)까지 꼭 써야 하나 싶은 거죠. 저도 처음엔 그랬습니다. 13년차 인프라 엔지니어로 일하면서 계정 탈취 사고, 피싱 메일, 세션 하이재킹(Session Hijacking) 이야기를 너무 많이 봤거든요. 그래서 결국 1년 정도 YubiKey를 메인 계정 보호용으로 써봤는데, 결론부터 말하면 피싱 방어 측면에서는 꽤 체감이 컸습니다. 다만 만능은 아니고, 운영 방식까지 같이 바꿔야 효과가 제대로 나오더라고요.

    이번 글은 광고성 사용기가 아니라, 제가 실제로 홈랩(Home Lab)과 개인 계정 운영에서 느낀 점을 정리한 YubiKey 사용 후기입니다. 좋은 점만 적지 않고, 불편했던 점과 삽질한 부분도 같이 적어보겠습니다.

    YubiKey 사용 후기와 계정 보호 개요를 보여주는 이미지

    보안 키를 도입하는 이유와 계정 보호 흐름을 한눈에 보여주는 개요 이미지입니다.

    1. 왜 이제는 YubiKey 같은 하드웨어 보안 키가 필요한가

    쉽게 말해, 비밀번호는 너무 자주 새고, 일회용 코드(OTP, One-Time Password)는 피싱 페이지에 속아 직접 입력하면 그대로 털릴 수 있습니다. 여기서 YubiKey 같은 하드웨어 보안 키는 접근 방식이 다릅니다. 사용자가 로그인하려는 사이트의 도메인(origin)을 기준으로 인증이 이뤄지기 때문에, 가짜 로그인 페이지에 속아도 인증이 성립하지 않는 경우가 많습니다.

    여기서 중요한 포인트가 하나 있습니다. YubiKey는 피싱 공격을 줄여주는 도구이지, 모든 계정 위협을 없애는 마법봉은 아닙니다. 예를 들어 이미 로그인된 세션을 훔치거나, 복구 이메일이 약하거나, 백업 코드 관리가 엉망이면 또 다른 구멍이 생깁니다. 저도 처음엔 “보안 키 꽂았으니 끝”이라고 생각했었는데, 실제로 써보니까 운영 정책이 더 중요하더라고요.

    2. YubiKey와 WebAuthn, FIDO2를 쉽게 설명해보면

    용어가 어렵게 느껴질 수 있는데, 저도 처음엔 좀 헷갈렸습니다 ㅎㅎ 그래서 최대한 쉽게 풀어볼게요.

    • FIDO2: 비밀번호 없는 로그인(passwordless)이나 강한 다중인증(MFA)을 위한 표준입니다.
    • WebAuthn(웹오스): 브라우저와 웹사이트가 보안 키와 대화할 수 있게 해주는 웹 표준입니다.
    • Security Key: 실제 손에 쥐는 물리 장치입니다. YubiKey가 여기에 해당하죠.
    • Origin Binding: 인증 정보가 특정 사이트 도메인에 묶여 동작하는 특성입니다. 피싱 방어의 핵심입니다.

    그러니까 구조는 이렇습니다. 사이트가 WebAuthn으로 인증을 요청하고, 브라우저가 보안 키와 통신하고, 사용자는 키를 터치합니다. 이때 키는 현재 접속 중인 사이트 정보와 함께 서명을 만들기 때문에, 겉보기만 그럴듯한 가짜 사이트에서는 통과가 안 되는 거죠. 제가 YubiKey를 쓰면서 가장 안심됐던 부분이 바로 이 메커니즘이었습니다.

    인증 방식 피싱 방어 편의성 비고
    비밀번호만 낮음 보통 유출 시 재사용 위험 큼
    SMS 인증 낮음~보통 높음 번호 탈취, 사회공학 공격 주의
    앱 OTP 보통 보통 가짜 페이지에 코드 입력하면 위험
    YubiKey + WebAuthn/FIDO2 높음 높음 지원 서비스에서 특히 강력

    3. 제가 1년 동안 어떻게 운영했는지

    제 사용 패턴은 단순했습니다. 가장 중요한 계정부터 보호하는 방식이었어요. 이메일, 패스워드 매니저(Password Manager), 개발자 플랫폼, 클라우드 콘솔(Cloud Console)처럼 뚫리면 연쇄 피해가 큰 계정부터 순서대로 등록했습니다.

    1. 주력 키 1개를 항상 손 닿는 곳에 둡니다.
    2. 예비 키 1개를 별도 장소에 보관합니다.
    3. 지원 서비스는 가능하면 WebAuthn 기반 MFA로 바꿉니다.
    4. 백업 코드(Recovery Codes)는 오프라인으로 분리 보관합니다.
    5. SMS는 최후의 예비 수단으로만 남기거나 가능하면 제거합니다.

    이 방식이 중요한 이유는 명확합니다. 보안 키는 잃어버릴 수 있거든요. 딱 하나만 등록해두면, 어느 날 진짜 피곤해집니다. 저도 초반에 예비 키 등록을 미뤘다가 “오늘 해야지, 내일 해야지” 하다가 한참 뒤에 정리했는데요. 이런 건 미루면 안 됩니다. 보안 키는 반드시 2개 이상 운영하는 걸 추천드립니다.

    YubiKey 사용 후기에서 설명하는 예비 키와 백업 코드 운영 구성 이미지

    주력 키와 예비 키, 백업 코드까지 포함한 실제 운영 구성을 설명하는 다이어그램입니다.

    4. 실전 구현: YubiKey 초기 점검과 기본 설정

    실제로 써보려면 제일 먼저 해야 할 건, 장치가 정상 인식되는지 확인하는 겁니다. 리눅스(Linux)나 macOS에서는 Yubico가 제공하는 도구를 많이 씁니다. 저는 CLI를 선호해서 YubiKey Manager CLI(ykman)부터 확인했습니다.

    4-1. 장치 인식 확인

    ykman info

    이 명령으로 연결된 키 정보와 지원되는 인터페이스를 확인할 수 있습니다. 환경에 따라 먼저 설치가 필요할 수 있고, 운영체제별 패키지 이름은 다를 수 있습니다. 여기서 포인트는 “내 시스템이 키를 정상적으로 보는지”부터 확인하는 겁니다.

    4-2. FIDO PIN 설정 또는 변경

    ykman fido access change-pin

    서비스에 따라 FIDO2 기능을 쓸 때 PIN이 필요할 수 있습니다. 처음엔 귀찮아 보였는데, 실제로 써보니까 분실 상황을 생각하면 있어야 하더라고요. 너무 쉬운 PIN은 피하시고, 그렇다고 복잡해서 본인만 잊어버리는 것도 좋지 않습니다.

    4-3. OTP 코드 관리가 필요할 때

    일부 서비스는 아직도 TOTP(Time-based One-Time Password) 기반 MFA를 주로 씁니다. 이 경우 YubiKey 자체보다 별도 OTP 앱이나 Yubico Authenticator 같은 도구를 같이 운영하게 될 수 있습니다. 다만 제 경험상 피싱 방어만 놓고 보면 TOTP보다 WebAuthn이 훨씬 만족도가 높았습니다.

    4-4. 서비스 등록 순서

    1. 주 계정 이메일부터 등록합니다.
    2. 패스워드 매니저에 등록합니다.
    3. 개발 플랫폼과 클라우드 콘솔 계정을 등록합니다.
    4. 예비 키를 바로 이어서 등록합니다.
    5. 복구 코드 저장 상태를 확인합니다.

    이 순서를 추천하는 이유는 간단합니다. 이메일과 패스워드 매니저가 뚫리면 나머지 보안 체계가 같이 무너질 수 있어서입니다. 여기서 중요한 포인트! 강한 MFA는 가장 중요한 계정부터 걸어야 체감 효과가 큽니다.

    5. 로그인할 때 실제로 얼마나 편했나

    이 부분이 의외로 중요합니다. 보안은 좋은데 매일 불편하면 결국 안 쓰게 되거든요. 근데 YubiKey는 생각보다 편했습니다. 특히 지원이 잘 된 서비스에서는 로그인 시도 후 키를 꽂거나 NFC로 태그하고 터치만 하면 끝나는 흐름이 많았습니다. 문자 기다릴 필요도 없고, 앱 열어서 숫자 입력할 일도 줄어들고요. 처음엔 이게 뭔가 싶었는데, 익숙해지고 나니까 오히려 OTP 입력 방식이 더 번거롭게 느껴졌습니다.

    반면 단점도 분명했습니다. 기기마다 포트가 다르고, 모바일에서는 NFC가 더 편한데 데스크톱은 USB가 직관적이더라고요. 그래서 사용 환경이 여러 개라면 연결 방식까지 고려해서 골라야 합니다. YubiKey 장단점을 한 줄로 줄이면 이렇습니다. 지원 서비스에서는 매우 편하고 강력하지만, 비지원 구간에서는 결국 기존 MFA와 병행해야 합니다.

    항목 좋았던 점 아쉬운 점
    피싱 방어 가장 체감 큼 서비스 지원 여부에 영향 받음
    로그인 속도 터치 한 번으로 끝나는 경우 많음 초기 등록은 조금 번거로움
    관리 편의성 예비 키 구조 만들면 안정적 분실 대비 체계가 필수
    범용성 여러 계정에 재사용 가능 모든 사이트가 동일하게 지원하진 않음
    YubiKey 사용 후기의 실전 로그인 인증 흐름 이미지

    브라우저에서 WebAuthn 인증을 진행하고 보안 키를 터치하는 실전 사용 흐름을 보여주는 이미지입니다.

    6. ⚠️ 실제로 겪었던 문제와 트러블슈팅

    여기서부터가 진짜 후기죠. YubiKey 사용 후기에서 좋은 얘기만 하면 사실 큰 의미가 없습니다. 저는 아래 상황에서 꽤 삽질했습니다.

    6-1. 예비 키 등록을 미뤄서 불안했던 시기

    가장 큰 실수였습니다. 메인 키만 등록하고 “나중에 예비 키 해야지” 하고 넘겼거든요. 만약 그때 키를 잃어버렸다면 복구 코드와 대체 수단에 의존해야 했을 겁니다. 해결책은 단순합니다. 첫 등록하는 날, 예비 키까지 한 번에 끝내세요.

    6-2. 서비스마다 인증 이름이 달라 헷갈림

    어떤 곳은 Security Key, 어떤 곳은 Passkey, 어떤 곳은 FIDO2나 WebAuthn이라고 표기하더라고요. 저도 처음엔 “이게 같은 계열 기능 맞나?” 싶었습니다. 실제 UI 이름은 달라도, 핵심은 하드웨어 보안 키 등록 메뉴를 찾는 겁니다. 보통 계정 보안(Security) 또는 2단계 인증(Two-Factor Authentication) 메뉴 안에 있습니다.

    6-3. 브라우저/OS 조합에 따라 동작 차이

    특정 환경에서는 바로 팝업이 뜨고, 어떤 환경에서는 한 번 더 승인 창이 뜨는 식의 차이가 있었습니다. 이건 서비스 문제가 아니라 운영체제와 브라우저의 인증 처리 방식 차이에서 오는 경우가 있더라고요. 그래서 저는 새 기기 세팅할 때 아래 체크리스트를 씁니다.

    • 브라우저가 최신 상태인지 확인
    • 보안 키가 OS에서 정상 인식되는지 확인
    • 계정 보안 설정에 예비 인증 수단이 있는지 확인
    • 복구 코드 보관 위치를 다시 확인

    6-4. 하드웨어 보안 키가 있어도 막지 못하는 영역

    이 부분은 꼭 짚고 넘어가야 합니다. 하드웨어 보안 키는 강력하지만, 이미 로그인된 브라우저 세션을 탈취하는 공격이나, 사용자가 악성 앱 설치를 허용하는 문제까지 다 막아주진 않습니다. 그래서 저는 브라우저 확장 프로그램 정리, 세션 관리, 복구 수단 최소화까지 같이 점검했습니다. 보안은 결국 계층 방어(Defense in Depth)거든요.

    7. 검증: 1년 써보니 실제로 달라진 점

    정량 수치를 일부러 과장하고 싶진 않습니다. 다만 체감 변화는 분명했습니다.

    • 가짜 로그인 페이지에 대한 불안이 줄었습니다. 이건 심리적인 안정감도 꽤 큽니다.
    • 중요 계정 로그인 품질이 올라갔습니다. 문자 코드 기다리거나 복붙할 일이 줄었습니다.
    • MFA 운영 습관이 정리됐습니다. 어떤 계정이 중요한지 우선순위를 다시 보게 되더라고요.
    • 복구 체계를 같이 손보게 됐습니다. 예비 키, 백업 코드, 복구 메일까지 정리하게 됩니다.

    특히 피싱 방어 관점에서는 효과를 높게 봤습니다. 공격자가 비밀번호를 알아도, 사용자가 가짜 사이트에 속아도, 보안 키 인증 단계에서 막히는 구조가 실제로 주는 차이가 크더라고요. 그래서 제 YubiKey 사용 후기를 한 문장으로 줄이면 이렇습니다. 귀찮음을 조금 앞당겨서, 계정 사고 확률을 꽤 낮추는 장치였습니다.

    YubiKey 사용 후기 결과 검증과 계정 보안 점검을 표현한 이미지

    등록 완료된 계정과 보안 점검 항목을 확인하는 결과 검증 이미지를 넣는 위치입니다.

    8. YubiKey 장단점 정리와 추천 대상

    혹시 이런 경험 있으신가요? 중요한 계정은 많은데, MFA 방식이 제각각이라 관리가 엉켜 있는 상황 말입니다. 그런 분들에겐 YubiKey가 꽤 괜찮은 기준점이 됩니다.

    추천하는 경우

    • 이메일, 패스워드 매니저, 개발자 계정처럼 핵심 계정이 많은 분
    • 피싱 메일이나 가짜 로그인 페이지가 걱정되는 분
    • OTP 입력보다 더 강한 MFA를 원하는 분
    • 예비 키와 복구 체계까지 같이 운영할 의지가 있는 분

    덜 맞을 수 있는 경우

    • 대부분의 서비스가 아직 보안 키를 지원하지 않는 환경
    • 키 분실 대비나 예비 장치 운영이 번거롭게 느껴지는 경우
    • 여러 기기 포트 규격을 맞추기 어려운 경우
    구분 평가 메모
    보안 강화 매우 만족 특히 피싱 방어 체감이 큼
    초기 세팅 보통 예비 키까지 하면 시간이 조금 듦
    일상 편의성 만족 지원 서비스에서는 OTP보다 편함
    유연성 보통 서비스별 지원 편차 존재

    9. 마무리: 정말 효과적이었나, 제 결론은 이렇습니다

    결론적으로, YubiKey 사용 후기를 냉정하게 정리하면 “피싱 방어에는 정말 효과적이다, 다만 운영을 같이 바꿔야 한다”입니다. 비밀번호만 잘 관리하던 시절보다, 그리고 OTP 앱만 쓰던 시절보다, 중요한 계정에 대한 불안감이 확실히 줄었습니다. 실제로 써보니까 보안 수준도 올라가고 로그인 동선도 오히려 단순해지는 구간이 있더라고요. 이거 진짜 편하더라고요.

    다만 다시 강조하겠습니다. 보안 키 하나 사서 끝은 아닙니다. 예비 키, 복구 코드, 계정 우선순위, 브라우저 보안 습관까지 같이 정리해야 효과가 살아납니다. 저도 처음엔 조금 헤맸는데, 한 번 구조를 잡아두니 그 뒤부터는 훨씬 편했습니다.

    다음 글에서는 홈랩 기준으로 패스키(Passkey)와 하드웨어 보안 키를 같이 운영하는 방법, 그리고 서비스별로 어떤 MFA를 남기고 어떤 건 제거할지 정리해볼 예정입니다. 이전 글에서 다뤘던 계정 분류 방법과 함께 보면 더 이해가 쉬우실 거예요.

    YubiKey 사용 후기 장단점과 도입 체크포인트 요약 이미지

    하드웨어 보안 키 도입 전 확인해야 할 체크포인트와 장단점을 요약하는 인포그래픽입니다.

    정리 FAQ

    Q1. YubiKey만 있으면 피싱 공격을 전부 막을 수 있나요?

    아닙니다. WebAuthn 기반 로그인 피싱 방어에는 강하지만, 세션 탈취나 복구 채널 취약점까지 전부 해결하진 못합니다.

    Q2. MFA로 OTP 앱만 써도 충분한가요?

    상황에 따라 다르지만, 피싱 방어만 놓고 보면 하드웨어 보안 키가 더 강한 경우가 많습니다.

    Q3. YubiKey는 몇 개 운영하는 게 좋나요?

    최소 2개입니다. 주력 1개, 예비 1개. 가능하면 복구 코드까지 오프라인으로 분리해두세요.

    Q4. 처음 도입할 때 가장 먼저 등록할 계정은 뭔가요?

    이메일, 패스워드 매니저, 개발자 플랫폼, 클라우드 콘솔 순으로 추천드립니다. 뚫렸을 때 연쇄 피해가 큰 계정부터 막아야 하거든요.

  • [Cloud] AWS IAM 권한 설계 베스트 프랙티스 – CISA GovCloud 키 유출 사건으로 배우는 클라우드 보안

    [Cloud] AWS IAM 권한 설계 베스트 프랙티스 – CISA GovCloud 키 유출 사건으로 배우는 클라우드 보안

    AWS IAM 권한 설계 베스트 프랙티스 – CISA GovCloud 키 유출 사건으로 배우는 클라우드 보안

    안녕하세요, 13년차 서버실 지킴이 ’13년차의 서버실’입니다. 오늘은 최근 발생했던 흥미롭지만 무서운 사건을 통해 AWS IAM 권한 설계의 중요성을 다시 한번 되짚어보려고 합니다. 바로 CISA (Cybersecurity and Infrastructure Security Agency)의 AWS GovCloud 키 유출 사건인데요. 미국 연방 기관에서 이런 보안 사고가 터졌다는 소식을 듣고 저도 처음엔 ‘설마 저런 일이…’ 싶었는데, 내용을 살펴보니 우리가 평소에 간과하기 쉬운 부분에서 발생한 문제더라고요.

    솔직히 인프라 엔지니어라면 누구나 한 번쯤은 ‘빨리 배포해야 하는데’, ‘이거 권한 없어서 안 되네, 그냥 다 열어버릴까?’ 하는 유혹에 빠져본 적 있을 겁니다. 저도 처음엔 이게 뭔가 싶어서 그냥 `*` (와일드카드)로 대충 권한 설정했다가 나중에 등골이 오싹했던 경험이 있거든요. 실제로 이런 클라우드 보안 사고가 터지면 수습하기 정말 힘들고, 기업 이미지에도 치명타를 입을 수 있습니다. 그래서 오늘은 CISA 사건을 교훈 삼아, AWS IAM(Identity and Access Management) 권한 설계를 어떻게 해야 안전하고 효율적으로 할 수 있을지, 제 삽질 경험을 녹여서 이야기해볼까 합니다.

    AWS IAM이 중심이 되는 클라우드 보안 아키텍처 다이어그램

    클라우드 환경에서 IAM은 단순한 사용자 관리를 넘어 전체 보안의 핵심입니다.

    AWS IAM, 최소 권한 원칙(Principle of Least Privilege)이란?

    본격적인 이야기에 앞서, 핵심 개념인 AWS IAM과 최소 권한 원칙(Principle of Least Privilege)에 대해 잠깐 짚고 넘어갈게요.

    • AWS IAM (Identity and Access Management, 아이덴티티 및 접근 관리): AWS 클라우드 리소스에 대한 접근을 안전하게 관리하는 웹 서비스입니다. 누가 어떤 리소스에 어떤 작업을 할 수 있는지 정의하는 역할을 하죠. 쉽게 말해, ‘회사 문지기’라고 생각하시면 편합니다. 누가 회사에 들어올 수 있고(인증), 어디까지 갈 수 있는지(권한 부여)를 결정하는 거죠.
    • 최소 권한 원칙 (Principle of Least Privilege): 이 원칙은 ‘필요한 최소한의 권한만 부여하라’는 강력한 보안 철학입니다. 예를 들어, 웹 서버가 S3 버킷에 파일을 업로드해야 한다면, S3에 파일을 읽고 쓰는 권한만 주면 됩니다. S3의 모든 설정 변경 권한이나 다른 서비스의 권한까지 줄 필요는 없다는 거죠. CISA 사건도 이 최소 권한 원칙이 제대로 지켜지지 않아 발생한 부분이 크다고 볼 수 있습니다.

    AWS IAM은 크게 IAM 사용자(User), IAM 그룹(Group), IAM 역할(Role), 그리고 이들의 권한을 정의하는 정책(Policy)으로 구성됩니다. 이 네 가지 요소를 잘 조합해서 안전한 환경을 만드는 게 핵심이에요.

    실전 구현: AWS IAM 권한 설계 베스트 프랙티스

    자, 이제 저의 홈랩에서 직접 적용하고 있는 AWS IAM 권한 설계 베스트 프랙티스 몇 가지를 소개해드릴게요. 이건 제가 직접 여러 번의 삽질 끝에 깨달은 소중한 경험들이거든요.

    1. 루트 사용자(Root User)는 금고에! MFA(Multi-Factor Authentication)는 필수!

      AWS 계정을 처음 만들면 ‘루트 사용자’가 생성되죠? 이 루트 사용자는 계정의 모든 권한을 가지고 있는 슈퍼 계정입니다. 절대! 일상적인 작업에 사용하면 안 됩니다. 저도 처음엔 그냥 루트 계정으로 다 했었는데, 나중에 보안 교육을 받고 식겁했어요. 루트 사용자는 계정 생성 후 한 번만 사용해서 IAM 사용자를 만들고, 강력한 암호와 함께 MFA (Multi-Factor Authentication, 다단계 인증)를 설정한 뒤 금고에 넣어두세요. 그리고 다시는 사용하지 않는 것이 좋습니다. 혹시 아직 MFA 설정 안 하셨다면 지금 당장 설정하세요! ⚠️

    2. IAM 사용자(User) 대신 IAM 역할(Role)을 적극 활용하세요!

      많은 분들이 EC2 인스턴스나 람다(Lambda) 함수에 권한을 줄 때, IAM 사용자 자격 증명(Access Key, Secret Key)을 직접 코드에 하드코딩하는 경우가 있습니다. 절대 금물입니다! 이 키가 유출되면 CISA 사건처럼 큰일 날 수 있어요. 대신 IAM 역할(Role)을 사용해야 합니다. IAM 역할은 특정 AWS 서비스나 사용자가 임시 자격증명을 자동으로 받아서 다른 리소스에 접근할 수 있게 해주는 기능이거든요. 키를 직접 관리할 필요가 없어서 훨씬 안전하고 편리하죠.

      예를 들어, EC2 인스턴스가 S3 버킷에 파일을 업로드해야 한다면, 다음과 같은 정책을 가진 IAM 역할을 만들어서 EC2 인스턴스에 할당하면 됩니다.

      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Effect": "Allow",
      "Action": [
      "s3:PutObject",
      "s3:GetObject",
      "s3:ListBucket"
      ],
      "Resource": [
      "arn:aws:s3:::my-secure-bucket",
      "arn:aws:s3:::my-secure-bucket/*"
      ]
      }
      ]
      }

      이 역할은 <code>my-secure-bucket이라는 S3 버킷에 대해서만 객체를 넣고, 가져오고, 버킷 내용을 나열하는 최소한의 권한만 부여합니다. 🎉

    3. 최소 권한 원칙에 기반한 정책(Policy) 설계

      위 예시처럼, 필요한 최소한의 작업(Action)과 리소스(Resource)만 명시하는 커스텀 정책(Custom Policy)을 만드는 습관을 들여야 합니다. AWS에서 제공하는 관리형 정책(Managed Policy)도 편리하지만, 너무 포괄적인 권한을 포함하는 경우가 많아요. 예를 들어, AmazonS3FullAccess 정책은 S3의 모든 작업을 허용하는데, 이건 대부분의 경우 과도한 권한입니다. 제가 직접 해보니 커스텀 정책이 손은 더 가지만, 훨씬 안전하더라고요. 처음엔 좀 어렵게 느껴질 수 있지만, 몇 번 만들어보면 익숙해집니다.

    4. 조건 키(Condition Keys)를 활용한 정교한 제어

      IAM 정책은 단순히 ‘누가 무엇을 할 수 있는가’를 넘어, ‘언제, 어디서, 어떻게’ 할 수 있는가까지 제어할 수 있습니다. 바로 조건 키(Condition Keys)를 활용하는 건데요. 특정 IP 주소 대역에서만 접근을 허용하거나, MFA 인증이 된 사용자만 특정 작업을 수행할 수 있도록 강제하는 등의 설정이 가능합니다. CISA 사건처럼 키가 유출되더라도, 추가적인 조건이 없다면 접근을 막을 수 있는 강력한 방어선이 됩니다.

      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-secure-bucket/*",
      "Condition": {
      "IpAddress": {
      "aws:SourceIp": "203.0.113.0/24"
      },
      "Bool": {
      "aws:MultiFactorAuthPresent": "true"
      }
      }
      }
      ]
      }

      위 정책은 203.0.113.0/24 IP 대역에서 MFA 인증을 거친 사용자만 S3 객체를 가져올 수 있도록 허용합니다. 💡

    5. AWS Access Analyzer로 권한 검토하기

      아무리 열심히 정책을 설계해도, 사람인지라 실수는 할 수 있습니다. 이때 AWS Access Analyzer가 정말 큰 도움이 됩니다. 이 서비스는 외부 엔티티(다른 AWS 계정, IAM 사용자, 역할 등)가 내 계정의 리소스(S3 버킷, SQS 큐 등)에 접근할 수 있는 경로를 분석하고 경고해줍니다. 제가 직접 써보니 예상치 못한 경로로 외부에 리소스가 공유된 걸 찾아내서 바로 조치할 수 있었어요. 정기적으로 Access Analyzer를 돌려 외부 접근 권한을 점검하는 습관을 들이는 게 좋습니다.

    AWS Access Analyzer 대시보드 화면

    Access Analyzer는 예상치 못한 권한 설정을 찾아내고 시각적으로 경고해줍니다.

    ⚠️ 주의사항 및 트러블슈팅: 삽질은 나의 힘!

    저도 AWS IAM 권한 설계를 하면서 수많은 삽질을 했습니다. 여러분은 저 같은 실수 하지 마시라고 몇 가지 팁을 공유해드려요.

    • 와일드카드(`*`) 사용은 정말 신중하게!

      특히 Action: "*"이나 Resource: "*"는 치명적일 수 있습니다. 처음엔 귀찮아서 이렇게 줬다가 나중에 ‘아차!’ 싶었던 적이 한두 번이 아니거든요. 항상 필요한 최소한의 범위만 지정하는 연습을 해야 합니다.

    • IAM Policy Simulator로 미리 테스트해보세요

      정책을 만들었는데 제대로 작동하는지 확신이 없을 때, IAM Policy Simulator를 사용하면 아주 유용합니다. 특정 사용자/역할이 특정 리소스에 대해 특정 작업을 수행할 수 있는지 시뮬레이션해볼 수 있거든요. 이거 써보니 삽질 많이 줄었습니다. ‘아, 이렇게 하면 되는구나!’ 하고 바로 알 수 있어서 진짜 편하더라고요.

    • 너무 빡빡한 권한은 오히려 문제!

      최소 권한 원칙도 좋지만, 너무 권한을 빡빡하게 설정해서 정작 필요한 작업이 안 되는 경우도 있습니다. 예를 들어, S3 버킷에 객체를 업로드하는 권한만 줬는데, 버킷 리스트를 볼 수 없어서 디버깅이 어려운 경우가 있었어요. 이때는 임시로 디버깅용 권한을 추가했다가, 문제 해결 후 다시 최소 권한으로 돌리는 유연함도 필요하더라고요. 역시 디버깅이 중요하더라고요.

    AWS IAM Policy Simulator 사용 화면

    정책 적용 전 IAM Policy Simulator로 미리 검증하면 불필요한 오류를 줄일 수 있습니다.

    AWS Access Analyzer를 통한 최종 검증

    권한 설정을 모두 마쳤다면, 다시 한번 AWS Access Analyzer를 통해 점검하는 과정을 거쳐야 합니다. 저는 이 과정을 습관처럼 하고 있는데요, 실제로 개발팀에서 실수로 특정 S3 버킷을 ‘Public’으로 열어둔 것을 Access Analyzer가 잡아내서 바로 수정했던 경험이 있습니다. 이렇게 검증하는 과정이 진짜 중요합니다. 단순한 실수가 큰 보안 사고로 이어질 수 있거든요.

    Access Analyzer는 지속적으로 계정을 모니터링하여 예상치 못한 외부 접근을 감지하고, 이에 대한 상세한 보고서를 제공합니다. 이 보고서를 바탕으로 정책을 조정하거나, 문제가 되는 설정을 수정하는 것이 중요합니다. ✅

    마무리하며: 보안은 끝이 없는 마라톤!

    오늘은 CISA AWS GovCloud 키 유출 사건을 통해 AWS IAM 권한 설계의 중요성과 베스트 프랙티스에 대해 이야기해봤습니다. 13년차 인프라 엔지니어로 살아오면서 느낀 건데, 보안은 정말 끝이 없는 마라톤과 같아요. 한 번 설정했다고 끝이 아니라, 지속적으로 검토하고 개선해야 합니다.

    오늘 제가 소개해드린 내용은 AWS IAM 권한 설계의 기본적인 베스트 프랙티스이지만, 이것만 잘 지켜도 대부분의 보안 위협으로부터 계정을 안전하게 보호할 수 있을 겁니다. 특히 최소 권한 원칙과 IAM 역할 활용은 꼭 기억해주세요. 혹시 이 글을 읽고 여러분의 AWS 환경을 다시 한번 점검해보는 계기가 된다면, 정말 기쁠 것 같네요.

    다음 글에서는 AWS GuardDuty나 Security Hub 같은 다른 보안 서비스들을 활용한 클라우드 보안 강화 방안에 대해 다뤄볼까 합니다. 기대해주세요! 👋

    AWS IAM 권한 설계 베스트 프랙티스 요약 인포그래픽

    안전한 AWS 환경을 위한 IAM 베스트 프랙티스 요약.