13년차의 서버실

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

[태그:] OpenStack 보안

  • [OpenStack] OpenStack 프로젝트 테넌트 격리 전략 비교와 보안 강화

    [OpenStack] OpenStack 프로젝트 테넌트 격리 전략 비교와 보안 강화

    OpenStack 프로젝트 테넌트 격리 전략 비교와 보안 강화

    OpenStack 프로젝트 테넌트 격리는 멀티테넌트 환경에서 가장 먼저 다져야 하는 기본기입니다. 겉으로는 프로젝트만 나누면 끝나 보이지만, 실제 운영에 들어가면 네트워크, 권한, 이미지, 볼륨, 스케줄링까지 같이 봐야 하더라고요. 저도 초반에는 프로젝트만 분리하면 충분하다고 생각했는데, 나중에 보니 공유 네트워크 하나가 경계를 흐리는 경우가 있었습니다.

    이번 글에서는 OpenStack 프로젝트 테넌트 격리를 어디까지 논리적으로 나눌지, 어디서부터 물리적 성격의 분리를 추가할지 비교해보겠습니다. 체크리스트만 훑는 글이 아니라, OpenStack 보안 관점에서 무엇을 먼저 적용해야 하는지와 테넌트 분리 수준별 운영 비용까지 같이 정리해보겠습니다.

    프로젝트, 네트워크, 하이퍼바이저, 스토리지 계층이 어떻게 분리되는지 한눈에 보여주는 아키텍처 이미지입니다.

    왜 OpenStack 프로젝트 테넌트 격리에서 프로젝트만 나누면 끝이 아닐까

    쉽게 말해 프로젝트는 행정 구역에 가깝고, 실제 경계는 따로 있습니다. 사용자는 프로젝트 기준으로 자원을 보지만, 패킷 흐름, 이미지 접근 권한, 볼륨 연결, 컴퓨트 노드 배치까지 자동으로 다 분리되지는 않거든요. 그래서 프로젝트 분리는 출발점일 뿐이고, 그 바깥 계층을 같이 설계해야 실전에서 흔들리지 않습니다.

    • Identity: 누가 어떤 프로젝트에 들어갈 수 있는지 결정합니다.
    • Network: 테넌트 간 동서 트래픽을 제어하는 핵심 축입니다.
    • Compute: 같은 하이퍼바이저에 섞을지, 분리할지 정합니다.
    • Storage: 이미지와 볼륨이 의도치 않게 공유되지 않도록 막아야 합니다.
    • Policy/RBAC: 운영자 권한이 지나치게 넓으면 격리 설계가 쉽게 무너집니다.

    운영해보면 사고는 화려한 기능보다 기본 설정 하나를 공유 상태로 둔 채 지나간 부분에서 더 자주 납니다. 특히 Horizon과 CLI로 만든 리소스가 섞이면 누가 무엇을 어떤 의도로 공유했는지 추적이 꽤 까다롭습니다. 이 지점이 생각보다 중요하더라고요.

    OpenStack 프로젝트 테넌트 격리 전략, 4단계로 나눠서 보기

    현업에서는 보통 4단계로 나눠 봅니다. 아래 표는 설계 검토할 때 바로 가져다 쓰기 좋은 기준에 가깝습니다.

    전략 핵심 방식 격리 강도 운영 복잡도 추천 상황 주의 포인트
    기본 논리 분리 프로젝트, 사용자, 보안 그룹 분리 중간 낮음 사내 개발/테스트 환경 공유 네트워크나 공개 이미지가 남아 있으면 경계가 약해집니다.
    네트워크 중심 분리 프로젝트별 네트워크, 라우터, RBAC 최소화 높음 중간 팀 간 독립 운영, 고객 분리 외부망 연결 방식과 Floating IP 정책을 같이 봐야 합니다.
    컴퓨트 배치 분리 Host Aggregate, Availability Zone 분리 높음 중간~높음 규제 대응, noisy neighbor 완화 스케줄링 정책과 리소스 부족 시 예외 처리 기준이 필요합니다.
    스토리지/암호화 포함 강한 분리 볼륨 타입 분리, 암호화, 이미지 접근 제한 매우 높음 높음 민감 데이터, 외부 고객 서비스 키 관리와 백업 경로까지 같이 분리해야 효과가 살아납니다.

    핵심은 단순합니다. OpenStack 보안은 기능 하나로 끝나지 않습니다. 프로젝트 분리는 시작이고, 네트워크와 권한 모델을 어떻게 묶느냐가 실제 체감 보안을 좌우합니다.

    기본 골격: 프로젝트, 사용자, 권한부터 단단하게

    처음 설계할 때는 프로젝트를 조직 단위로만 나누기 쉬운데, 실제로 써보면 환경 단위(dev, stage, prod)까지 별도 프로젝트로 자르는 편이 운영이 훨씬 편합니다. 같은 팀이라도 운영 환경과 개발 환경이 섞이면 이미지 공유나 보안 그룹 재사용이 자연스럽게 생기거든요. 나중에 감사나 장애 대응 때 차이가 꽤 크게 납니다.

    1. 프로젝트를 환경 또는 고객 기준으로 분리합니다.
    2. 사용자는 최소 권한 원칙에 맞춰 필요한 프로젝트에만 넣습니다.
    3. 운영자 계정은 범용 admin 하나로 뭉개지 말고 역할을 나눕니다.
    4. 공유 리소스는 허용보다 금지를 기본값으로 잡습니다.
    openstack project create prod-team-a
    openstack user create --project prod-team-a --password-prompt teama-admin
    openstack role add --project prod-team-a --user teama-admin member
    
    openstack project create dev-team-a
    openstack user create --project dev-team-a --password-prompt teama-dev
    openstack role add --project dev-team-a --user teama-dev member
    
    openstack role assignment list --project prod-team-a --names
    openstack quota show prod-team-a

    위 명령은 모두 OpenStackClient에서 일반적으로 사용하는 기본 흐름입니다. 다만 수동으로 반복 생성하기 시작하면 프로젝트마다 quota나 역할 구성이 조금씩 달라지기 쉽습니다. 이게 나중에 제일 사람을 힘들게 하더라고요.

    판단 기준도 같이 기억해두면 좋습니다.

    • role assignment list 결과에 예상하지 못한 admin 계열 역할이 보이면 권한 과다를 먼저 의심합니다.
    • quota show가 비어 있거나 기본값만 따라가면 특정 테넌트의 자원 폭주를 제어하기 어렵습니다.
    • 운영자 공용 계정을 여러 팀이 함께 쓰면 추적성이 크게 떨어집니다.

    OpenStack 프로젝트 테넌트 격리에서 실전 차이는 네트워크 분리에서 난다

    프로젝트를 나눠도 네트워크가 공유되면 체감상 같은 건물에 문패만 바꿔 다는 수준이 됩니다. 그래서 멀티테넌트 환경에서는 프로젝트별 자체 네트워크와 자체 라우터를 기본값으로 두는 편이 안전합니다. 공유 네트워크나 RBAC 공유는 예외 승인 방식으로 돌리는 게 번거로워 보여도, 사고 예방 효과는 확실합니다.

    openstack network create --project prod-team-a prod-team-a-net
    openstack subnet create --project prod-team-a \
      --network prod-team-a-net \
      --subnet-range 10.10.10.0/24 \
      prod-team-a-subnet
    
    openstack router create --project prod-team-a prod-team-a-router
    openstack router add subnet prod-team-a-router prod-team-a-subnet
    openstack router set --external-gateway public prod-team-a-router
    
    openstack security group create --project prod-team-a prod-team-a-web-sg
    openstack security group rule create --ingress --ethertype IPv4 \
      --protocol tcp --dst-port 22 prod-team-a-web-sg
    openstack security group rule create --ingress --ethertype IPv4 \
      --protocol tcp --dst-port 443 prod-team-a-web-sg
    
    openstack network rbac list
    openstack security group rule list prod-team-a-web-sg

    이 구간에서 자주 나오는 실수도 비슷합니다. 외부 게이트웨이만 다르면 충분하다고 생각하거나, 보안 그룹 규칙을 여러 프로젝트에서 관성적으로 복사해 쓰는 경우죠. 처음엔 편한데 규칙이 커질수록 누가 왜 열었는지 설명이 안 됩니다.

    OpenStack 프로젝트 테넌트 격리 네트워크 분리 구성 이미지

    각 프로젝트가 독립된 네트워크와 라우터를 가지며, 외부망은 공용이더라도 내부 통신 경계는 분리되는 구조를 보여주는 이미지입니다.

    운영하다 보면 테스트 서버 때문에 0.0.0.0/0로 SSH를 잠깐 열어뒀는데, 비슷한 규칙이 운영 프로젝트에도 따라 들어간 경우가 꼭 생깁니다. 이런 경험 한 번쯤 있으실 겁니다. 그래서 보안 그룹은 템플릿화하되, 프로젝트별 별도 객체로 관리하는 편이 훨씬 낫더라고요.

    재현 가능한 시나리오 하나

    예를 들어 팀 A와 팀 B가 같은 클라우드를 쓰고 있는데, 운영자가 편의를 위해 하나의 공유 네트워크를 두 프로젝트에 RBAC로 열어뒀다고 가정해보겠습니다. 그 상태에서 두 팀의 인스턴스가 같은 L2 세그먼트에 붙고 보안 그룹 규칙까지 느슨하면, 동서 통신이 예상보다 넓게 열릴 수 있습니다. 이럴 때는 아래 순서로 확인하면 됩니다.

    • openstack network show <network>로 네트워크 소유자와 공유 상태를 확인합니다.
    • openstack network rbac list에서 어떤 프로젝트에 접근이 열려 있는지 봅니다.
    • openstack port list --project <project>로 각 프로젝트 포트가 어느 네트워크에 붙었는지 추적합니다.

    여기서 중요한 건 숫자보다 의도하지 않은 연결 관계입니다. 보안 진단은 평균값을 보는 작업이라기보다 예외 케이스를 집요하게 확인하는 작업에 가깝습니다.

    한 단계 더: 컴퓨트와 스토리지까지 분리해야 하는 경우

    여기서부터는 고객 성격에 따라 판단이 갈립니다. 같은 하이퍼바이저에 다른 고객 워크로드가 같이 올라가도 되는지, 볼륨 백엔드가 완전히 공용이어도 되는지 따져봐야 하거든요. 규제 대응이나 민감한 데이터가 있다면 논리 분리만으로는 설명이 부족한 경우가 많습니다.

    • Availability Zone: 프로젝트별 또는 업무별 배치 경계를 만듭니다.
    • Host Aggregate: 특정 컴퓨트 노드 그룹으로 스케줄링합니다.
    • Volume Type: 성능, 백엔드, 암호화 정책을 나눕니다.
    • Image 접근 제어: 공개 이미지와 공유 이미지를 최소화합니다.
    openstack aggregate create team-a-aggregate
    openstack aggregate add host team-a-aggregate compute-01
    openstack aggregate add host team-a-aggregate compute-02
    openstack aggregate set --zone team-a-az team-a-aggregate
    
    openstack volume type list
    openstack image list --public
    openstack image list --shared
    openstack image show <image-id>

    명령 자체는 단순해 보여도 운영 포인트는 따로 있습니다. 스케줄링 실패 로그를 어떻게 해석할지 기준을 정해두지 않으면, 인스턴스 생성 실패를 무조건 리소스 부족으로만 보기 쉽습니다. 실제로는 aggregate 메타데이터나 AZ 선택이 맞지 않아 배치가 막히는 경우도 많습니다.

    이미지 공개 설정도 꼭 봐야 합니다. 프로젝트 격리를 열심히 해놨는데 public 또는 shared 이미지 안에 민감한 에이전트 설정이나 초기 계정 스크립트가 들어 있으면 다른 종류의 사고가 됩니다. 그래서 golden image를 쓰더라도 공개 범위는 아주 좁게 잡는 편이 안전합니다.

    OpenStack 프로젝트 테넌트 격리 컴퓨트 분리 다이어그램

    특정 프로젝트가 전용 컴퓨트 노드 그룹과 가용 영역으로 스케줄링되는 모습을 설명하는 이미지입니다.

    자주 봤던 문제와 해결 방법

    문서만 보면 구조가 깔끔해 보이지만, 실무에서는 늘 예외가 먼저 튀어나옵니다. 아래 네 가지는 멀티테넌트 환경에서 정말 자주 만나는 문제입니다.

    1. 공유 리소스가 남아 있는 경우

    가장 흔합니다. 네트워크, 이미지, 보안 그룹 템플릿 운영 방식 중 하나라도 사실상 공유 상태로 굴러가면 경계가 흐려집니다. 해결책은 단순합니다. 기본값을 비공유로 두고, 필요한 경우만 승인 절차로 열기입니다.

    2. 운영자 권한이 너무 넓은 경우

    도와주려고 준 권한이 나중에는 우회 경로가 됩니다. 도메인 관리자와 클라우드 관리자 역할을 분리하지 않으면 프로젝트 격리의 의미가 금방 약해집니다. 이 부분은 생각보다 체감 차이가 큽니다.

    3. 보안 그룹을 방화벽처럼 과신하는 경우

    보안 그룹은 중요하지만 전부는 아닙니다. 라우팅, 포트 소유, Floating IP 정책, 메타데이터 서비스 접근 제어까지 같이 봐야 합니다. 보안 그룹 하나로 다 해결하려고 하면 운영이 오히려 꼬입니다.

    4. 로그는 있는데 읽는 기준이 없는 경우

    이 문제도 꽤 큽니다. 예를 들어 인스턴스가 의도한 AZ에 올라가지 않았다면, 단순 실패로 넘기지 말고 격리 정책이 실제로 작동 중인지 또는 예외 정책이 필요한지를 같이 판단해야 합니다. 장애 대응 문서에는 아래 체크 순서를 넣어두면 도움이 됩니다.

    • 네트워크 문제면 포트 소속 프로젝트와 보안 그룹 규칙부터 확인
    • 배치 문제면 AZ, aggregate, flavor extra spec 사용 여부 확인
    • 스토리지 문제면 volume type과 백엔드 정책 일치 여부 확인

    처음엔 체크 항목이 많아 보여도, 순서를 정해두면 대응 속도가 확실히 빨라집니다. 이런 건 실제로 해보면 차이가 바로 느껴집니다.

    검증은 이렇게 합니다: 설정 확인보다 경계 확인

    OpenStack 프로젝트 테넌트 격리가 잘 됐는지 보려면 리소스가 생성됐는지만 보면 부족합니다. 다른 프로젝트 사용자 입장에서 안 보여야 할 것이 정말 안 보이는지, 붙으면 안 되는 네트워크가 실제로 안 붙는지까지 확인해야 합니다. 결국 중요한 건 설정값이 아니라 경계가 의도대로 작동하는지입니다.

    1. 프로젝트 A 계정으로 로그인해 프로젝트 B의 네트워크, 인스턴스, 볼륨이 보이는지 확인합니다.
    2. RBAC 목록에서 예상하지 못한 공유 규칙이 없는지 확인합니다.
    3. 공개 이미지와 공유 이미지 목록을 각각 점검합니다.
    4. 보안 그룹 규칙에 과도한 Any 규칙이 없는지 확인합니다.
    openstack server list --project prod-team-a
    openstack network list --project prod-team-a
    openstack port list --project prod-team-a
    openstack volume list --project prod-team-a
    openstack image list --private
    openstack image list --public
    openstack image list --shared
    openstack network rbac list

    해석 기준은 이렇습니다.

    • 보이면 안 되는 타 프로젝트 리소스가 보이면 Identity 또는 공유 정책 점검이 먼저입니다.
    • 프로젝트 전용 네트워크가 아닌 공용 네트워크에 포트가 붙어 있으면 설계 예외인지 설정 누락인지 바로 구분해야 합니다.
    • 공개 이미지나 공유 이미지가 과도하게 많으면 이미지 배포 체계를 다시 잡는 편이 좋습니다.
    • 보안 그룹에 광범위한 인바운드 규칙이 있으면 앞단 제어 계층까지 같이 검토하는 게 안전합니다.
    OpenStack 프로젝트 테넌트 격리 검증 결과 대시보드 이미지

    프로젝트별 리소스 목록, RBAC 규칙, 공개 이미지 수를 점검하는 운영 검증 화면을 표현한 이미지입니다.

    비교해보면, 어떤 전략을 선택해야 할까

    이쯤 되면 선택 기준이 조금 선명해집니다. 모든 환경에 최고 강도의 분리를 넣는다고 꼭 좋은 건 아닙니다. 운영 복잡도가 확 올라가거든요. 반대로 고객 서비스나 민감 데이터 환경인데 기본 논리 분리만 두는 것도 위험합니다.

    환경 추천 격리 수준 이유 추가 권고
    사내 개발/테스트 프로젝트 + 네트워크 분리 운영 부담을 크게 늘리지 않으면서도 사고 범위를 줄일 수 있습니다. 공유 리소스 승인 절차는 반드시 둡니다.
    운영 서비스 프로젝트 + 네트워크 + 이미지 통제 서비스 간 영향 최소화와 변경 추적이 중요합니다. 보안 그룹 템플릿과 quota 정책을 같이 표준화합니다.
    외부 고객 멀티테넌트 프로젝트 + 네트워크 + 컴퓨트 분리 고객 간 경계와 noisy neighbor 대응이 필요합니다. AZ, aggregate, 운영자 역할 분리를 같이 적용합니다.
    민감 정보/규제 환경 전 계층 분리 + 스토리지 암호화 논리 분리만으로는 설명 책임이 부족할 수 있습니다. 백업, 키 관리, 감사 로그 보존 정책까지 묶어 설계합니다.

    이 표는 정답표라기보다, 실제 운영에서 어디까지 해야 충분한지 가늠하는 기준점에 가깝습니다. 저도 가벼운 실험 환경에서는 단순하게 갔지만, 운영 환경으로 갈수록 네트워크와 권한 모델을 먼저 단단히 다지는 쪽이 결과가 좋았습니다.

    FAQ: OpenStack 프로젝트 테넌트 격리에서 헷갈리는 포인트

    프로젝트만 나누면 테넌트 분리가 끝난 건가요?

    아닙니다. 프로젝트는 시작점입니다. 네트워크 공유, 이미지 공개 또는 공유, 운영자 권한 범위가 남아 있으면 경계가 충분하지 않을 수 있습니다.

    보안 그룹만 잘 쓰면 되지 않나요?

    보안 그룹은 중요하지만 전부가 아닙니다. 라우터, RBAC, 이미지 접근, 컴퓨트 배치까지 같이 봐야 진짜 클라우드 보안이 됩니다.

    가용 영역 분리는 언제 필요할까요?

    고객별 워크로드 분리, 규제 대응, 성능 간섭 완화가 필요할 때 고려합니다. 다만 운영 복잡도가 올라가니 일반 개발 환경에는 과할 수 있습니다.

    현업 기준으로 권고를 딱 정리하면

    팀 내부 개발 환경이라면 프로젝트 분리, 프로젝트별 네트워크, 최소 권한 모델까지만 해도 효과가 큽니다. 이 조합이 운영 부담 대비 효율이 가장 좋습니다. 반면 외부 고객이 함께 쓰는 멀티테넌트 클라우드라면 여기서 멈추기 아쉽습니다. 그 경우에는 네트워크 공유 금지, 이미지 공개 최소화, AZ 또는 Host Aggregate 기반 배치 분리까지 넣는 편이 맞습니다.

    민감 데이터가 있는 서비스라면 더 분명합니다. 스토리지 암호화와 볼륨 타입 분리까지 포함해 전 계층으로 끌고 가는 게 낫습니다. 운영은 조금 복잡해져도, 사고 이후 설명 비용보다 훨씬 싸게 먹힙니다. 다음 글에서는 Keystone 역할 설계와 서비스 계정 분리 패턴도 다뤄보겠습니다. 이전 글의 보안 그룹 운영 기준과 함께 보면 흐름이 더 잘 잡힐 겁니다.

    OpenStack 프로젝트 테넌트 격리 전략 비교 인포그래픽

    개발, 운영, 외부 고객, 민감 정보 환경별로 어떤 격리 전략을 선택해야 하는지 요약한 인포그래픽 이미지입니다.

  • [OpenStack] OpenStack 프라이빗 클라우드 보안 강화: 최신 감사 보고서 분석 및 대응 전략

    [OpenStack] OpenStack 프라이빗 클라우드 보안 강화: 최신 감사 보고서 분석 및 대응 전략

    [인프라] OpenStack 프라이빗 클라우드 보안 강화 대응 전략

    OpenStack 프라이빗 클라우드 보안 이야기는 평소엔 좀 뒤로 밀리기 쉽습니다. 서비스가 잘 돌고 있으면 당장 체감이 안 되거든요. 그런데 클라우드 보안 감사 한 번 들어오면 분위기가 바로 달라집니다. 계정 정책, API TLS, 로그 보관, 이미지 무결성 같은 항목이 한꺼번에 쏟아지니까요. 저도 홈랩과 실무 환경에서 비슷한 점검을 여러 번 겪어봤는데, 처음엔 “이건 설정 파일 몇 개만 손보면 되겠지” 싶었거든요. 근데 막상 들어가 보니 Keystone(키스톤, 인증/인가), Nova(노바, 컴퓨트), Neutron(뉴트론, 네트워크), RabbitMQ(래빗MQ, 메시지 브로커)까지 서로 얽혀 있어서 삽질 좀 했습니다 ㅎㅎ

    이번 글은 특정 벤더 보고서 하나를 요약하는 방식보다는, 최근 감사에서 반복적으로 지적되는 OpenStack 보안 항목을 공식 Security Guide와 체크리스트 기준으로 묶어서 정리한 내용입니다. 즉, 보고서가 달라도 결국 자주 걸리는 포인트는 비슷하더라고요. 그래서 오늘은 OpenStack 프라이빗 클라우드 보안을 실제 운영 관점에서 어떻게 강화할지, 제가 실무에서 우선순위를 잡는 방식으로 풀어보겠습니다.

    컨트롤 플레인, 컴퓨트 노드, 스토리지, 관리망과 외부망을 분리한 OpenStack 보안 아키텍처 예시입니다.

    1. 왜 감사에서 늘 같은 항목이 걸릴까요?

    쉽게 말해 감사는 “설정이 있느냐”보다 보안 경계(Security Boundary, 보안 경계)가 실제로 분리되어 있느냐를 봅니다. OpenStack은 컴포넌트가 많아서, 한 군데만 HTTPS를 켰다고 끝나지 않거든요. 예를 들어 Horizon(호라이즌, 대시보드)은 TLS를 쓰는데 서비스 간 내부 통신은 평문으로 남아 있거나, RabbitMQ 인증서는 넣었는데 호스트네임 검증은 꺼져 있는 식입니다. 겉으로는 안전해 보여도 감사에서는 바로 티가 납니다.

    제가 최근 점검할 때도 지적이 많이 나온 항목은 아래 네 가지였습니다.

    • 관리망과 외부망 분리 부족: 내부 API가 외부 엔드포인트를 타는 경우
    • 과도한 권한: 관리자 계정 공유, 서비스 계정 권한 과다
    • 로그는 있는데 감사 추적이 어려움: 중앙 수집과 상관분석 부재
    • 이미지/메시지 경로 무결성 미흡: 이미지 서명 검증, 메시지 브로커 TLS 검증 미설정

    2. OpenStack 보안 베스트 프랙티스, 핵심만 먼저 잡아보겠습니다

    OpenStack 보안 베스트 프랙티스를 한 줄로 줄이면 이겁니다. “외부 공개 구간만 막지 말고, 내부 제어면(Control Plane, 제어 평면)까지 신뢰하지 말자.” 저도 처음엔 내부망이면 괜찮지 않나 싶었는데, 실제로는 운영자 실수나 계정 탈취가 더 무섭더라고요.

    감사 항목 자주 보이는 문제 즉시 대응 장기 대응
    인증/인가 관리자 계정 공유, MFA 미적용 관리자 계정 분리, 외부 IdP 연동 검토 RBAC 재설계, 페더레이션 적용
    통신 보안 내부 API 평문, 인증서 검증 비활성화 HTTPS 강제, internal endpoint 지정 전 구간 TLS, 인증서 수명주기 자동화
    감사 로그 노드별 로그 분산, 이벤트 표준화 부족 중앙 로그 수집 CADF 기반 감사 추적 체계화
    무결성 이미지 검증 없음, 설정 파일 변경 감시 없음 서명 검증, 권한 점검 FIM, 골든 이미지 파이프라인

    여기서 중요한 포인트! 감사 대응은 문서부터 쓰는 게 아니라 데이터 흐름부터 그려야 합니다. 누가 로그인하고, 어떤 API를 타고, 어떤 메시지 브로커를 지나, 최종적으로 어떤 로그가 남는지 보셔야 합니다. 이 흐름이 안 보이면 체크리스트만 돌려도 자꾸 빠지는 항목이 생깁니다.

    3. 실전 구현 1: 계정, 엔드포인트, TLS부터 정리합니다

    제가 직접 해보니 제일 효과가 큰 첫 단계는 “접속면 줄이기”였습니다. 즉, 공개 엔드포인트와 내부 엔드포인트를 분리하고, 서비스 간 통신이 public URL이 아니라 internal URL을 쓰도록 강제하는 겁니다.

    1. 서비스 카탈로그(Service Catalog, 서비스 목록)에서 internal endpoint를 분리합니다.
    2. 각 서비스 설정에서 Keystone 인증 URL과 연동 URL이 HTTPS인지 확인합니다.
    3. insecure = false 여부를 전부 확인합니다.
    openstack endpoint list --long
    openstack endpoint create identity --region RegionOne internal https://keystone.internal.example:5000/v3
    openstack endpoint create image --region RegionOne internal https://glance.internal.example:9292
    openstack endpoint create network --region RegionOne internal https://neutron.internal.example:9696
    # /etc/nova/nova.conf
    [keystone_authtoken]
    www_authenticate_uri = https://keystone.internal.example:5000
    auth_url = https://keystone.internal.example:5000
    insecure = false
    
    [glance]
    api_servers = https://glance.internal.example:9292

    이 작업은 단순해 보여도 효과가 큽니다. 내부 관리 트래픽이 외부 공개 주소를 타지 않게 되니까요. 특히 프록시나 로드밸런서가 여러 겹일 때 감사 추적도 훨씬 쉬워집니다.

    OpenStack 프라이빗 클라우드 보안 내부 API TLS 분리 구성 이미지

    public endpoint와 internal endpoint를 분리하고 서비스 간 통신을 HTTPS로 고정한 예시 구성입니다.

    4. 실전 구현 2: RabbitMQ, 로그, 이미지 무결성을 같이 보셔야 합니다

    OpenStack은 API만 안전해도 끝이 아닙니다. 실제로 서비스끼리 대화하는 길목은 RabbitMQ 같은 메시지 브로커인 경우가 많거든요. 여기 TLS를 켜도 인증서 체인만 보고 호스트네임 검증을 안 하면 허점이 남습니다. 최근 oslo.messaging 릴리스 노트에서도 이 부분이 분명히 언급됐습니다. 그래서 제가 운영할 때는 브로커 TLS와 로그 표준화를 같이 묶어서 봅니다.

    # /etc/nova/nova.conf 또는 공통 oslo.messaging 설정
    [oslo_messaging_rabbit]
    ssl = true
    ssl_ca_file = /etc/ssl/certs/openstack-ca.pem
    ssl_cert_file = /etc/ssl/certs/client.pem
    ssl_key_file = /etc/ssl/private/client-key.pem
    ssl_enforce_hostname_verification = true

    단, 이 옵션은 배포판 패키지 버전에 따라 지원 여부가 다를 수 있습니다. 그래서 바로 적용하기 전에 패키지 changelog나 릴리스 노트를 꼭 보셔야 합니다. 저도 이거 모르고 넣었다가 서비스 재시작만 반복한 적이 있었네요.

    감사 로그 쪽은 Keystone의 CADF(Cloud Auditing Data Federation, 클라우드 감사 이벤트 표준) 포맷을 적극 검토할 만합니다. 사람이 보기엔 조금 딱딱하지만, SIEM(보안 정보 이벤트 관리)으로 넘길 때 훨씬 정리가 잘 됩니다.

    # /etc/keystone/keystone.conf
    [DEFAULT]
    notification_format = cadf

    그리고 이미지 무결성도 자주 빠뜨립니다. Glance(글랜스, 이미지 서비스)와 Nova에서 서명 검증 흐름을 넣어두면, 검증되지 않은 이미지 부팅을 줄일 수 있습니다.

    # /etc/nova/nova.conf
    [glance]
    verify_glance_signatures = true

    처음엔 이게 너무 과한가 싶었는데, 골든 이미지(Golden Image, 표준 이미지)를 운영하는 환경에서는 진짜 편하더라고요. 누가 어떤 이미지를 올렸는지, 검증됐는지 흐름이 분명해집니다.

    OpenStack 프라이빗 클라우드 보안 감사 로그와 RabbitMQ TLS 흐름 이미지

    메시지 브로커 TLS 보호와 Keystone CADF 감사 로그가 중앙 수집 시스템으로 모이는 흐름입니다.

    5. 실전 구현 3: 파일 권한과 노드 하드닝은 기본인데 가장 많이 놓칩니다

    이건 너무 기본 같아서 오히려 빼먹습니다. 그런데 공식 Security Checklist를 보면 Keystone, Nova, Neutron 설정 파일의 소유권과 권한을 아주 명확하게 확인하라고 하거든요. 감사에서도 이건 빠지지 않습니다.

    stat -L -c "%U %G %a" /etc/keystone/keystone.conf
    stat -L -c "%U %G %a" /etc/nova/nova.conf
    stat -L -c "%U %G %a" /etc/neutron/neutron.conf
    find /etc/keystone /etc/nova /etc/neutron -type f -perm /027 -ls

    제가 주로 보는 기준은 이렇습니다.

    • 서비스 계정과 그룹이 올바른지 확인
    • 설정 파일 권한이 과도하게 열려 있지 않은지 확인
    • SELinux(셀리눅스, 강제 접근 통제)나 AppArmor 정책과 충돌 없는지 확인
    • FIM(File Integrity Management, 파일 무결성 감시) 대상에 핵심 설정 파일 포함

    여기서 많이 겪는 문제는 자동화 도구가 재배포하면서 권한을 널널하게 바꿔버리는 경우입니다. 특히 템플릿 한 군데 잘못 두면 전체 노드가 같은 실수를 반복합니다. 그래서 저는 배포 후 검증 명령을 CI 파이프라인이나 운영 점검 스크립트에 꼭 넣습니다.

    6. ⚠️ 감사 때 자주 터지는 트러블슈팅

    이 섹션은 실전에서 진짜 많이 부딪히는 부분입니다.

    6-1. HTTPS는 켰는데 인증 실패가 납니다

    대부분 CA 체인이나 호스트네임 불일치입니다. 인증서를 넣었다고 끝이 아니고, 서비스가 접속하는 URL과 인증서 SAN(Subject Alternative Name, 주체 대체 이름)이 맞아야 합니다.

    6-2. 내부 통신을 HTTPS로 바꾸니 서비스 등록은 됐는데 호출이 꼬입니다

    이 경우 public endpoint는 바꿨는데, 개별 서비스 설정은 여전히 외부 주소를 보고 있는 경우가 많습니다. 카탈로그와 각 서비스 설정 파일을 둘 다 봐야 합니다.

    6-3. 로그는 모이는데 감사 보고서에서 추적성이 부족하다고 나옵니다

    이건 단순 보관이 아니라 상관관계(Correlation, 상관 분석) 문제입니다. 사용자 로그인, 토큰 발급, 인스턴스 생성, 볼륨 연결, 보안그룹 변경 이벤트를 하나의 흐름으로 이어서 볼 수 있어야 하거든요. 그래서 Keystone 이벤트, API 로그, 하이퍼바이저 로그를 따로 보지 말고 묶어야 합니다.

    6-4. 보안 강화 후 성능이 걱정됩니다

    맞습니다. TLS와 추가 로깅은 비용이 있습니다. 그래서 저는 처음부터 전부 켜기보다 인터넷 노출 구간, 관리자 구간, 메시지 브로커, 이미지 검증 순서로 우선순위를 잡습니다. 한 번에 다 바꾸면 장애 원인 분석이 어려워집니다.

    7. 검증은 이렇게 하시면 됩니다

    보안 설정은 “넣었다”가 아니라 “검증됐다”로 끝내야 합니다. 제가 보통 마지막에 확인하는 체크는 아래와 같습니다.

    1. 모든 핵심 서비스 엔드포인트가 HTTPS인지 확인
    2. 서비스 설정의 insecure = true 흔적 제거 확인
    3. 메시지 브로커 TLS 연결 및 인증서 검증 확인
    4. CADF 또는 중앙 로그에서 관리자 행위 추적 가능 여부 확인
    5. 서명되지 않은 이미지가 정책상 차단되는지 확인
    openstack endpoint list --long | egrep "https|Region"
    grep -R "insecure *= *true" /etc/keystone /etc/nova /etc/neutron /etc/glance
    openssl s_client -connect rabbitmq.internal.example:5671 -servername rabbitmq.internal.example
    openstack image list
    openstack server list

    완료 후 대시보드와 CLI 둘 다 테스트해보세요. Horizon만 되고 CLI가 안 되거나, 반대로 API는 되는데 메타데이터 프록시가 깨지는 경우가 있습니다. 저도 이 단계에서 “드디어 됐다!” 했다가 보안그룹 갱신이 안 되는 걸 뒤늦게 발견한 적이 있었거든요.

    OpenStack 프라이빗 클라우드 보안 강화 결과 대시보드 이미지

    보안 점검 항목이 통과되고 중앙 로그에서 관리자 행위를 추적할 수 있는 결과 화면 예시입니다.

    8. 정리: OpenStack 프라이빗 클라우드 보안은 순서가 중요합니다

    OpenStack 프라이빗 클라우드 보안은 기능을 많이 넣는 게임이 아닙니다. 순서를 잘 잡는 작업에 가깝습니다. 제가 실제로 운영하면서 느낀 우선순위는 이렇습니다. 계정 통제 → 내부 API TLS → 메시지 브로커 보호 → 감사 로그 표준화 → 이미지 무결성 → 파일 무결성 감시. 이 순서로 가면 감사 대응도 수월하고, 장애가 나도 어디서 꼬였는지 찾기 편합니다.

    혹시 지금 프라이빗 클라우드 감사 대응을 준비 중이시라면, 문서부터 만들기보다 먼저 엔드포인트와 계정, 로그 흐름을 그림으로 그려보세요. 그 다음에 체크리스트를 맞추면 훨씬 빨라집니다. 다음 글에서는 Barbican(바비칸, 비밀 관리 서비스)과 이미지 서명 체계를 조금 더 깊게 다뤄보겠습니다. 이전에 정리한 리눅스 하드닝 글이 있으시면 그 흐름과 같이 보셔도 연결이 잘 됩니다.

    OpenStack 프라이빗 클라우드 보안 강화 우선순위 요약 이미지

    계정 통제, TLS, 로그, 이미지 무결성, 파일 무결성 감시 순서로 정리한 대응 우선순위 요약입니다.

    9. 자주 묻는 질문

    Q1. 작은 홈랩에도 이렇게까지 해야 할까요?

    전부 한 번에 할 필요는 없습니다. 다만 관리자 계정 분리, HTTPS, 설정 파일 권한 점검은 작은 환경에서도 바로 체감됩니다.

    Q2. 클라우드 보안 감사에서 가장 빨리 점수 올리는 항목은 뭔가요?

    보통은 내부 API TLS, 관리자 접근 통제, 중앙 로그 수집입니다. 이 세 개가 눈에 잘 보이고 재현도 쉽습니다.

    Q3. OpenStack 보안 베스트 프랙티스를 어디서 시작하면 좋을까요?

    공식 Security Checklist를 서비스별로 돌려보는 게 제일 현실적입니다. Keystone, Nova, Neutron부터 보시면 됩니다.

  • [OpenStack] OpenStack Barbican 보안: 민감 데이터 관리 체크리스트

    [OpenStack] OpenStack Barbican 보안: 민감 데이터 관리 체크리스트

    OpenStack Barbican 보안: 민감 데이터 관리 체크리스트

    OpenStack Barbican 보안은 생각보다 뒤로 밀리기 쉽더라고요. 처음에는 VM, 네트워크, 스토리지부터 안정화하느라 바쁘고, 비밀번호나 인증서 같은 민감 데이터는 환경 변수나 설정 파일로 잠깐 버티는 경우가 많습니다. 그런데 운영 기간이 길어질수록 이런 방식은 거의 반드시 문제를 만듭니다. 누가 어떤 Secret(시크릿, 민감 정보)을 만들었는지 추적이 안 되고, 권한이 넓게 퍼지고, 백업 파일이나 로그에 값이 섞여 들어가기도 하거든요. 그래서 핵심은 민감 데이터를 서비스 밖으로 분리하고 중앙에서 통제하는 것입니다. 이번 글에서는 실제 운영 전에 꼭 점검할 체크리스트를 중심으로 정리해보겠습니다.

    특히 OpenStack 키 관리가 필요한 환경, 인증서와 API 키를 여러 서비스가 나눠 쓰는 환경, 그리고 감사 로그까지 챙겨야 하는 팀이라면 이 체크리스트가 꽤 실용적입니다. 실제로 해보면 Barbican 자체를 띄우는 것보다 주변 권한 설계, 네트워크 경계, 백엔드 보안 구성이 더 중요하더라고요.

    Barbican이 Keystone(키스톤, 인증), API, Secret Store(시크릿 저장소), 데이터베이스, 백엔드 키 관리 계층과 어떻게 연결되는지 한눈에 보여주는 개요 이미지가 들어갈 자리입니다.

    1. 왜 OpenStack Barbican 보안이 중요한가

    Barbican은 단순한 비밀번호 보관함이 아닙니다. OpenStack 환경 전반에서 비밀번호, TLS 인증서, 대칭키, 개인키 같은 비밀 정보의 저장과 접근 제어를 담당하는 키 관리 서비스에 가깝습니다. OpenStack 공식 문서에서도 Barbican은 기본 시크릿 저장 서비스로 설명되고, Keystone 토큰과 정책 기반 접근 제어를 함께 사용합니다.

    중요한 점은 Barbican을 도입했다고 바로 안전해지지는 않는다는 겁니다. 중앙 집중형 서비스라서 설정이 느슨하면 위험도 같이 중앙 집중화됩니다. 그래서 클라우드 보안 체크리스트 관점으로 접근해야 합니다. 저장소 암호화, API 접근 통제, 전송 구간 TLS, 감사 로그, 키 순환(rotation)을 같이 봐야 운영에서 덜 흔들립니다.

    2. Barbican 핵심 개념, 쉽게 정리해보면

    처음에는 용어가 많아 보여도 구조를 단순하게 보면 금방 감이 옵니다.

    • Secret(시크릿): 비밀번호, 토큰, 인증서 같은 민감 데이터 본문입니다.
    • Container(컨테이너): 여러 Secret을 묶는 논리적 그룹입니다. 인증서, 개인키, 체인 인증서를 한 세트로 관리할 때 특히 편합니다.
    • Consumer(컨슈머): 어떤 서비스가 해당 Secret을 사용하는지 연결 정보를 남기는 개념입니다.
    • Policy(정책): 누가 생성, 조회, 삭제할 수 있는지 정의하는 접근 제어 규칙입니다.
    • Backend(백엔드): 실제 키 관리 장치나 저장소 계층입니다. 소프트웨어 기반 저장소일 수도 있고, HSM(Hardware Security Module, 하드웨어 보안 모듈)이나 외부 연동형 키 관리 백엔드일 수도 있습니다.

    운영에서 자주 헷갈리는 부분은 이것입니다. Barbican은 보안 기능의 끝이 아니라 연결점이라는 점이죠. Keystone, TLS 인증서, 데이터베이스 보호, 백업 정책이 같이 맞물려야 진짜 효과가 납니다.

    3. OpenStack 키 관리 시작 전 체크리스트

    배포 전에 아래 항목만 제대로 확인해도 사고 확률이 꽤 줄어듭니다.

    1. API 엔드포인트를 TLS로 보호했는지 확인합니다.
    2. Keystone 프로젝트와 역할(Role)이 최소 권한으로 설계되었는지 점검합니다.
    3. 관리 네트워크와 사용자 접근 네트워크를 분리했는지 봅니다.
    4. 데이터베이스 접근 계정이 Barbican 전용인지 확인합니다.
    5. 백엔드 저장소 암호화가 활성화되어 있는지 확인합니다.
    6. 감사 로그와 API 로그가 중앙 수집되는지 점검합니다.
    7. Secret 수명주기, 즉 생성, 사용, 폐기, 순환 주기가 문서화되어 있는지 확인합니다.
    8. 백업본에 민감 데이터가 평문으로 남지 않는지 체크합니다.

    이 부분은 정말 많이 놓칩니다. Barbican 안쪽만 단단하게 만들고, 백업 스냅샷이나 운영 스크립트에 시크릿이 그대로 남아 있는 경우가 있거든요. 로그 확인하다가 테스트용 토큰이 남아 있는 걸 뒤늦게 발견하면 식은땀이 납니다.

    4. 실전 구현: Secret 저장과 접근 흐름 점검

    이제 실전 쪽으로 가보겠습니다. 아래 예시는 OpenStack CLI 기준의 기본 흐름입니다. 환경마다 옵션은 조금 다를 수 있지만, 점검 포인트는 거의 같습니다. 특히 예시에서는 실제 운영 비밀번호를 명령줄에 직접 넣지 않는 쪽으로 바꿨습니다. 터미널 히스토리와 운영 문서에 값이 남는 걸 줄이려면 이 습관이 꽤 중요합니다.

    4-1. OpenStack 인증 환경 준비

    export OS_AUTH_URL=https://keystone.example.com:5000/v3
    export OS_USERNAME=barbican-auditor
    export OS_PASSWORD='REPLACE_ME'
    export OS_PROJECT_NAME=security
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_IDENTITY_API_VERSION=3
    

    여기서 첫 번째 체크 포인트는 운영용 관리자 계정을 그대로 쓰지 않는 것입니다. 읽기 전용 점검 계정, 운영 계정, 자동화 계정을 나누는 게 좋습니다. 조금 번거로워도 나중에 감사 추적할 때 차이가 확실히 납니다.

    4-2. Secret 저장 테스트

    openstack secret store \
      --name db-password \
      --file ./db-password.txt \
      --payload-content-type text/plain
    

    테스트용 시크릿을 저장해봅니다. 공식 CLI 문서 기준으로 --payload를 쓸 때는 --payload-content-type가 필요하고, 운영에서는 평문 값을 명령줄에 직접 남기지 않는 편이 더 안전합니다. 이거 작은 습관 같아도 나중에 로그나 히스토리 정리할 때 꽤 편하더라고요.

    4-3. 저장 결과 확인

    openstack secret list --name db-password
    
    openstack secret get --payload https://barbican.example.com/v1/secrets/REPLACE_WITH_SECRET_HREF
    

    여기서 중요한 포인트가 하나 있습니다. openstack secret get은 이름이 아니라 Secret URI를 인자로 받습니다. 이 부분을 헷갈려서 db-password 같은 이름을 바로 넣는 경우가 있는데, 실제 점검에서는 목록에서 Secret href를 확인한 뒤 조회해야 합니다. 또, 의도하지 않은 프로젝트에서 동일 리소스가 보이지 않는지도 꼭 확인해야 합니다. OpenStack Barbican 보안에서 흔한 실수 중 하나가 프로젝트 경계를 느슨하게 가져가는 거거든요.

    OpenStack Barbican 보안에서 프로젝트 권한 분리를 설명하는 구성도

    시크릿 생성, 프로젝트별 권한 분리, 운영 계정과 감사 계정의 역할 차이를 설명하는 구성 이미지가 들어갈 자리입니다.

    4-4. 컨테이너와 인증서 묶음 관리 예시

    TLS 인증서 체인을 다룰 때는 Secret 하나로 끝나지 않는 경우가 많습니다. 인증서, 개인키, 체인 파일을 묶어서 관리하는 구조를 설계해야 하죠. 이럴 때 Container 개념이 꽤 유용합니다.

    대상 Barbican에 저장할 항목 운영 체크 포인트
    웹 API TLS 서버 인증서, 개인키, 체인 인증서 만료일 점검, 교체 절차 문서화
    애플리케이션 비밀번호 DB 계정 정보, API 토큰 순환 주기, 접근 계정 최소화
    서비스 간 암호화 대칭키 또는 참조 정보 배포 자동화와 연계 여부

    이런 식으로 민감 데이터 보호 범위를 유형별로 나눠서 관리하면 운영이 훨씬 깔끔해집니다.

    5. 보안 강화 체크리스트: 운영에서 꼭 봐야 할 항목

    이 섹션은 실제 점검표처럼 그대로 써도 될 만한 내용입니다. 새 환경을 열 때마다 거의 같은 항목을 다시 확인하게 되더라고요.

    5-1. 네트워크와 전송 구간

    • Public API를 외부에 직접 노출하지 않았는지 확인합니다.
    • TLS 인증서 체인이 올바르게 구성되었는지 점검합니다.
    • 로드밸런서와 프록시 뒤에 둘 경우 원본 클라이언트 추적 로그가 남는지 확인합니다.
    • 관리 네트워크 접근 제어를 보안 그룹과 방화벽 양쪽에서 점검합니다.

    5-2. 인증과 권한

    • Keystone 역할(Role)을 세분화합니다.
    • 서비스 계정과 사용자 계정을 분리합니다.
    • 공용 프로젝트에 시크릿을 몰아넣지 않습니다.
    • 삭제 권한과 조회 권한을 분리할 수 있으면 분리합니다.

    5-3. 저장소와 백엔드

    • 백엔드가 소프트웨어 저장소인지, 외부 연동형 KMS/HSM인지 명확히 구분합니다.
    • 데이터베이스 백업본이 암호화되는지 확인합니다.
    • 운영체제 디스크 암호화와 파일 권한을 같이 점검합니다.
    • 교체 주기(rotation)를 사람 기억에 맡기지 말고 일정화합니다.

    5-4. 로그와 감사 추적

    • 누가 Secret을 만들고 조회했는지 추적 가능한지 확인합니다.
    • 민감 값 자체가 로그에 남지 않도록 마스킹 정책을 점검합니다.
    • 실패한 인증 시도와 비정상 접근 패턴을 중앙 로그에서 볼 수 있어야 합니다.

    접근은 막았는데 로그에 payload가 찍혀서 의미가 없어지는 경우가 있습니다. 이거 진짜 허무합니다. OpenStack 키 관리는 저장만이 아니라 흔적 관리까지 포함이라고 봐야 합니다.

    6. 설정 예시: 운영 문서에 넣기 좋은 체크 항목

    아래처럼 운영 표준 문서에 넣을 수 있는 형태로 남겨두면 좋습니다.

    barbican_security_checklist:
      api_tls:
        enabled: true
        certificate_chain_verified: true
      identity:
        dedicated_service_accounts: true
        least_privilege_roles: true
      storage:
        encrypted_backup: true
        restricted_db_access: true
      audit:
        api_access_logging: true
        secret_payload_logging: false
      operations:
        rotation_policy_defined: true
        orphan_secret_review: monthly
    

    이 문서는 예쁘게 만드는 게 목적이 아닙니다. 누가 봐도 같은 기준으로 점검할 수 있게 만드는 것이 핵심이죠. 팀 문서 정리할 때 이런 형태가 가장 오래 살아남더라고요.

    OpenStack 키 관리 운영 체크리스트와 자동화 파이프라인 이미지

    YAML 기반 점검표, 배포 자동화, 감사 로그 수집이 어떻게 연결되는지 보여주는 이미지가 들어갈 자리입니다.

    7. 트러블슈팅: 운영에서 자주 겪는 문제

    Barbican은 올렸는데 기대한 만큼 바로 매끄럽게 굴러가지는 않을 때가 있습니다. 특히 권한과 복구 쪽에서 문제가 자주 나오더라고요.

    7-1. Secret은 저장되는데 서비스 연동이 안 되는 경우

    원인은 대개 권한 문제였습니다. 저장 자체는 되는데 실제 사용하는 서비스 계정이 읽지 못하는 거죠. 해결도 결국 권한 설계였습니다. 어떤 프로젝트에서 생성했고, 누가 읽어야 하는지를 다시 분리해서 맞추는 게 핵심입니다.

    7-2. 운영자는 보이는데 자동화 계정은 실패하는 경우

    이건 RC 파일이나 토큰 스코프(scope, 권한 범위) 문제가 많았습니다. 관리자 세션으로는 다 되니까 더 헷갈립니다. 실제 자동화 계정으로 같은 명령을 재현해보면 원인이 비교적 빨리 드러납니다.

    7-3. 백업은 멀쩡한데 복구 후 접근 오류가 나는 경우

    백엔드 키 관리 계층과 DB 상태가 같이 맞아야 하는데, 일부만 복구하면 접근 오류가 납니다. 그래서 복구 리허설이 정말 중요합니다. 백업 성공 메시지보다 복구 후 Secret을 실제로 조회할 수 있는지가 더 중요하거든요.

    7-4. 오래된 시크릿이 계속 남아 있는 경우

    운영하다 보면 애플리케이션은 교체됐는데 예전 Secret은 삭제되지 않는 경우가 많습니다. 이건 보안 문제이자 관리 비용 문제입니다. 월 1회라도 고아 시크릿(orphan secret) 점검을 권장합니다.

    openstack secret list --long
    

    이 명령으로 목록을 보면서 생성 시점, 상태, 설명 규칙이 일관적인지 같이 보시면 좋습니다. 이름 규칙이 없으면 나중에 진짜 힘들어집니다.

    8. 검증과 결과 확인: 무엇을 보면 잘 구성된 걸까

    단순히 시크릿 저장이 성공했다고 끝은 아닙니다. 운영 기준으로는 아래 조건이 맞아야 합격이라고 보는 편이 더 현실적입니다.

    1. 일반 사용자 계정은 다른 프로젝트의 시크릿을 볼 수 없습니다.
    2. 서비스 계정은 필요한 시크릿만 읽을 수 있습니다.
    3. API 호출이 TLS로 보호됩니다.
    4. 로그에는 접근 이벤트가 남지만 민감한 payload는 직접 남지 않습니다.
    5. 백업과 복구 테스트 후에도 시크릿 접근이 정상 동작합니다.
    6. 교체 대상 시크릿 목록과 일정이 문서화되어 있습니다.

    검증용으로는 기능 테스트와 권한 테스트를 분리해서 보는 게 좋습니다. 운영자 계정으로 성공하는지, 서비스 계정으로도 의도대로 되는지, 권한 없는 계정은 확실히 실패하는지를 각각 봐야 합니다. 이게 OpenStack Barbican 보안 점검의 핵심입니다.

    OpenStack Barbican 보안 검증 결과와 접근 로그 시각화

    정상 접근, 권한 거부, 감사 로그 기록 상태를 비교해서 보여주는 검증 결과 이미지가 들어갈 자리입니다.

    9. 정리: 민감 데이터 보호는 기능보다 운영이 더 중요합니다

    정리해보면, Barbican은 굉장히 유용한 서비스입니다. 다만 Barbican 활용의 포인트는 기능을 켜는 데 있지 않고 운영 기준을 만드는 데 있습니다. 누가 만들고, 누가 읽고, 언제 바꾸고, 어디에 기록되는지까지 정리돼 있어야 비로소 안전해집니다. 처음엔 설정 몇 줄이면 끝날 것 같아도, 실제로는 권한 설계와 검증 시나리오를 만드는 데 시간이 더 들더라고요. 그런데 그 시간을 아끼면 나중에 더 크게 돌아옵니다.

    다음 글에서는 Barbican을 다른 OpenStack 서비스와 연계할 때 무엇을 더 신경 써야 하는지 다뤄보겠습니다. 이전에 정리한 Keystone 권한 설계 글과 함께 보면 흐름을 잡는 데 더 도움이 됩니다.

    핵심 점검 항목, 우선순위, 다음 단계 작업을 요약한 인포그래픽 이미지가 들어갈 자리입니다.

    10. FAQ: 현장에서 자주 나오는 질문

    Q1. Barbican만 도입하면 민감 데이터 보호가 끝나나요?

    아닙니다. 민감 데이터 보호는 저장, 전송, 권한, 로그, 백업, 복구까지 같이 봐야 합니다.

    Q2. 소규모 환경에서도 꼭 필요할까요?

    네. 규모보다도 비밀번호와 인증서를 여러 시스템이 나눠 쓰는 순간 필요성이 커집니다. 홈랩에서도 한 번 구조를 잡아두면 훨씬 편합니다.

    Q3. 가장 먼저 점검할 한 가지를 꼽자면?

    우선순위 하나만 고르라면 최소 권한(least privilege, 최소 권한 원칙)입니다. 저장소가 안전해도 접근 권한이 넓으면 효과가 크게 줄어듭니다.

  • [OpenStack] OpenStack Keystone 인증 시스템, 1년 운영 후기 및 보안 강화 팁

    [OpenStack] OpenStack Keystone 인증 시스템, 1년 운영 후기 및 보안 강화 팁

    [OpenStack] OpenStack Keystone 운영 후기와 보안 강화 팁

    OpenStack Keystone 운영 후기 이야기를 해보려고 합니다. 클라우드를 처음 올릴 때는 Nova(노바, 컴퓨트), Neutron(뉴트론, 네트워크), Cinder(신더, 블록 스토리지) 쪽이 더 눈에 잘 들어오는데요. 실제로 1년 정도 굴려보면 장애의 시작점이 생각보다 Keystone(키스톤, 인증 및 권한 관리 서비스)인 경우가 꽤 많습니다. 로그인은 되는데 토큰이 안 맞는다든지, 서비스 계정 권한이 꼬인다든지, 외부에 노출된 엔드포인트(endpoint, 서비스 접속 지점) 관리가 애매해진다든지요. 저도 처음엔 이게 뭔가 싶었는데, 막상 운영해보니 Keystone은 단순한 로그인 서버가 아니라 OpenStack 전체의 신뢰 기준점이더라고요.

    특히 홈랩과 사내 테스트 환경을 같이 운영하면서 느낀 건, Keystone 보안과 인증 시스템 관리가 느슨하면 나머지 서비스도 같이 흔들린다는 점이었습니다. 이번 글에서는 제가 직접 겪은 OpenStack Keystone 운영 후기와 함께, 실제로 효과 있었던 OpenStack 보안 강화 팁을 정리해보겠습니다.

    OpenStack Keystone 운영 후기를 설명하는 전체 인증 아키텍처 다이어그램

    Keystone이 사용자, 프로젝트, 역할, 토큰, 각 OpenStack 서비스 사이에서 어떻게 동작하는지 보여주는 전체 구조 예시입니다.

    1. 왜 Keystone이 운영에서 그렇게 중요할까요?

    쉽게 말해 Keystone은 누가, 어디까지, 어떤 방식으로 접근할 수 있는지를 판단하는 관문입니다. 사용자는 인증(authentication, 본인 확인)을 받고, 그 다음 권한 부여(authorization, 접근 허용 범위 결정)를 통해 프로젝트(project, 테넌트 성격의 작업 공간)와 역할(role, 권한 묶음)에 맞는 작업만 하게 됩니다.

    문제는 여기서 한 번 꼬이면 영향 범위가 넓다는 겁니다. 예를 들어:

    • 대시보드 Horizon(호라이즌) 로그인 실패
    • CLI에서 토큰 발급 실패
    • Nova나 Glance 같은 서비스 간 인증 실패
    • 내부 서비스 계정 비밀번호 만료 또는 잘못된 role 할당
    • 엔드포인트 URL 혼선으로 internal/public 트래픽 분리 실패

    제가 실제로 써보니까, 컴퓨트 노드 한 대 죽는 것보다 Keystone 설정 하나 잘못 들어간 게 복구 피로도가 더 높을 때도 있었습니다. 왜냐하면 장애가 여러 서비스에 퍼져 보이거든요. 겉으로는 Nova 오류처럼 보여도 원인은 Keystone 토큰 검증 실패인 경우가 있었습니다.

    2. Keystone 핵심 개념, 쉽게 말해 이렇게 이해하면 됩니다

    처음 접하시면 용어가 좀 많습니다. 저도 처음엔 헷갈렸는데, 아래처럼 묶어서 이해하니까 훨씬 편하더라고요.

    개념 영문 쉽게 말한 뜻
    사용자 User OpenStack에 로그인하거나 API를 호출하는 주체
    프로젝트 Project 리소스를 묶는 작업 공간
    도메인 Domain 사용자와 프로젝트를 더 큰 범위로 구분하는 단위
    역할 Role 허용된 권한 세트
    토큰 Token 인증 후 발급되는 일시적 접근 증표
    엔드포인트 Endpoint 서비스 API가 열려 있는 주소
    카탈로그 Service Catalog 사용 가능한 서비스 목록과 접속 정보

    여기서 중요한 포인트가 있습니다. Keystone 보안은 단순히 비밀번호를 복잡하게 만드는 수준이 아닙니다. 토큰 수명, 키 회전(rotation), 서비스 계정 분리, TLS(전송 구간 암호화), 로그 감사(audit)까지 같이 봐야 합니다.

    토큰 방식은 왜 신경 써야 할까요?

    운영하면서 체감이 컸던 부분이 토큰입니다. 예전에는 UUID 토큰 이야기도 많이 나왔지만, 실제 운영에선 Fernet(퍼넷, 대칭키 기반의 서명된 토큰 포맷) 쪽이 관리 포인트를 줄이는 데 도움이 됐습니다. DB 조회 부담이 줄고, 토큰 검증 구조가 단순해지는 장점이 있거든요. 다만 그 대신 Fernet 키 관리를 제대로 해야 합니다. 키를 안 돌리면 보안상 찜찜하고, 반대로 무작정 돌리면 토큰 검증 이슈가 생길 수 있습니다.

    3. 제가 1년 운영하면서 정착한 기본 구성

    제 기준의 안정적인 기본 원칙은 아래였습니다.

    1. 관리용 admin 접근과 일반 사용자 접근을 논리적으로 분리합니다.
    2. TLS(전송 계층 보안)는 반드시 앞단 프록시나 로드밸런서에서라도 적용합니다.
    3. 서비스 계정(service account)은 사람 계정과 섞지 않습니다.
    4. 권한은 최소 권한(least privilege)으로 시작합니다.
    5. Fernet 키 회전 주기와 시간 동기화(NTP/Chrony)를 같이 관리합니다.
    6. 관리 네트워크와 외부 노출 네트워크를 분리합니다.

    말은 쉬운데, 실제 운영에선 이걸 꾸준히 지키는 게 어렵습니다. 특히 테스트 환경에서 급하게 계정 하나 더 만들고, role 하나 더 붙이고, endpoint를 임시로 public에 노출해두면 나중에 꼭 빚처럼 돌아오더라고요. 삽질 좀 했습니다 ㅎㅎ

    4. 실전 구현: Keystone 기본 설정과 보안 초기값

    아래 예시는 배포판이나 패키지 구성에 따라 경로가 조금 다를 수 있지만, 큰 흐름은 비슷합니다. 핵심은 Fernet 초기화, 부트스트랩, 서비스 확인입니다.

    4-1. Fernet 키 초기화

    keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

    이 단계는 토큰과 자격 증명 암호화의 기반이 됩니다. 여기서 파일 권한이 어긋나면 나중에 토큰 검증에서 조용히 말썽을 부리기도 합니다. 저는 한 번 소유권이 꼬여서 Apache(아파치, 웹 서버) 프로세스는 살아 있는데 Keystone 응답만 이상하게 나오는 상황을 겪었습니다.

    4-2. bootstrap 실행

    keystone-manage bootstrap \
      --bootstrap-password 'CHANGE_ME_STRONG_PASSWORD' \
      --bootstrap-admin-url https://keystone.example.internal:5000/v3/ \
      --bootstrap-internal-url https://keystone.example.internal:5000/v3/ \
      --bootstrap-public-url https://keystone.example.com:5000/v3/ \
      --bootstrap-region-id RegionOne

    여기서 public/internal URL을 어떻게 나눌지 미리 정해두는 게 정말 중요합니다. 처음엔 대충 같은 주소 넣어도 되지 않나 싶었는데, 운영 환경이 커지면 인증 시스템 관리가 바로 복잡해집니다. 외부 접속용, 내부 서비스 통신용, 운영자 점검용을 구분해두면 나중에 정책 적용이 쉬워집니다.

    Keystone 보안과 인증 시스템 관리에 필요한 엔드포인트 분리 구성 다이어그램

    public, internal, admin 성격의 접근 경로를 나누고 Fernet 키와 서비스 계정을 관리하는 설정 흐름 예시입니다.

    4-3. 기본 환경 변수 설정

    export OS_AUTH_URL=https://keystone.example.com:5000/v3
    export OS_USERNAME=admin
    export OS_PASSWORD='CHANGE_ME_STRONG_PASSWORD'
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_IDENTITY_API_VERSION=3

    운영 중에는 shell history(셸 기록)에 민감 정보가 남지 않도록 조심하셔야 합니다. 저는 실제로 테스트 서버에서 급하게 붙어 작업하다가 환경 변수 관리가 느슨해진 적이 있었는데요. 이후에는 별도 openrc 파일 권한 제한과 비밀값 주입 방식 통일로 정리했습니다.

    4-4. 프로젝트, 사용자, 역할 생성

    openstack project create --domain default --description "Service Project" service
    openstack project create --domain default --description "Operations Project" ops
    openstack user create --domain default --password 'STRONG_SERVICE_PASSWORD' glance
    openstack role create reader
    openstack role add --project service --user glance admin

    여기서 흔히 하는 실수가 사람 계정과 서비스 계정을 같은 패턴으로 관리하는 겁니다. 저는 초반에 편하다고 운영자 계정 하나로 이것저것 테스트했었는데, 나중에 로그를 보면 누가 무슨 작업을 했는지 흐려집니다. 사람은 사람 계정, 서비스는 서비스 계정. 이 원칙이 감사(audit) 대응에도 좋았습니다.

    4-5. 설정 파일에서 꼭 보는 항목

    [token]
    provider = fernet
    
    [cache]
    enabled = true
    
    [security_compliance]
    lockout_failure_attempts = 5
    lockout_duration = 1800
    unique_last_password_count = 5
    password_expires_days = 90

    배포판과 릴리스에 따라 지원 항목 차이가 있을 수 있으니, 실제 적용 전에는 사용 중인 문서를 꼭 확인하셔야 합니다. 다만 운영 원칙은 분명합니다. 토큰 방식 명확화, 캐시 전략 점검, 로그인 실패 잠금, 비밀번호 정책은 반드시 챙기셔야 합니다.

    5. Keystone 보안, 실제로 효과 있었던 강화 팁

    이 섹션은 정말 체감 위주입니다. 스펙 표보다 운영 안정성에 더 직접적인 것들만 추렸습니다.

    5-1. TLS 적용은 선택이 아니었습니다

    내부망이라 괜찮겠지 싶을 수 있는데, 실제로는 내부망이 제일 오래 방치됩니다. 프록시 계층에서라도 TLS를 적용하고, 인증서 갱신 주기를 운영 절차에 넣는 게 좋습니다. 특히 Horizon과 Keystone이 같이 얽혀 있을 때 mixed content나 redirect 문제도 정리되더라고요.

    5-2. Fernet 키 회전 자동화

    keystone-manage fernet_rotate

    이 명령 자체는 단순합니다. 문제는 언제, 어떤 순서로, 몇 개의 키를 유지할지입니다. 제가 운영하면서 얻은 교훈은, 키 회전은 cron만 걸어두고 끝낼 일이 아니라는 점이었습니다. 여러 컨트롤러 노드가 있다면 키 동기화 순서와 배포 타이밍을 같이 관리해야 합니다.

    5-3. 시간 동기화는 사소해 보여도 필수입니다

    토큰이 유효한데도 간헐적으로 인증이 튀는 경우가 있었습니다. 처음엔 Keystone 자체 문제인 줄 알았는데, 알고 보니 노드 간 시간이 조금씩 어긋나 있었어요. 이거 진짜 흔합니다. chrony(크로니, 시간 동기화 도구)나 NTP 상태를 같이 점검하세요.

    5-4. 서비스 카탈로그와 엔드포인트 정리

    OpenStack 보안을 이야기할 때 의외로 자주 놓치는 게 endpoint 정리입니다. 안 쓰는 public endpoint를 남겨두면 관리 부담이 생기고, 내부 서비스가 public URL을 타기 시작하면 네트워크 정책도 꼬입니다.

    openstack endpoint list
    openstack service list

    분기마다 한 번씩이라도 정리해보세요. 저는 운영 6개월 차쯤부터 정기 점검 항목으로 넣었습니다.

    5-5. Application Credential 적극 활용

    자동화 스크립트나 CI에서 사람 계정 비밀번호를 직접 쓰는 건 피하시는 게 좋습니다. 가능하면 Application Credential(애플리케이션 자격 증명) 같은 방식을 고려해 분리하세요. 스크립트 유출 범위를 줄이는 데 도움이 됩니다.

    6. ⚠️ 운영 중 실제로 겪었던 문제와 해결 방법

    여기서부터는 OpenStack Keystone 운영 후기다운 내용입니다. 책에는 짧게 나오는데, 현장에서는 꽤 귀찮은 문제들입니다.

    6-1. 토큰이 가끔만 실패하는 문제

    증상: 어떤 요청은 되고, 어떤 요청은 401이 나옵니다.

    원인: 시간 동기화 불일치, 캐시 반영 지연, 다중 노드 환경에서 키 동기화 문제.

    해결:

    1. 컨트롤러 노드 시간 차이 확인
    2. Fernet 키 디렉터리 소유권과 동기화 상태 확인
    3. 웹 서버 재로드 전후 캐시 반영 점검

    처음엔 네트워크 문제로 의심했는데, 결국 시계가 문제였던 적이 있었습니다. 정말 허탈하더라고요.

    6-2. Horizon 로그인은 되는데 일부 메뉴가 비정상인 문제

    증상: 로그인은 되는데 프로젝트 리소스가 안 보이거나 API 호출이 실패합니다.

    원인: role 할당 누락, project scope 설정 문제, endpoint 카탈로그 불일치.

    해결:

    openstack token issue
    openstack role assignment list --user admin --names
    openstack catalog list

    이 세 개를 같이 보면 방향이 잡히는 경우가 많았습니다. 특히 토큰 발급은 되는데 scope가 예상과 다르면, 사용자 입장에서는 그냥 고장처럼 보이거든요.

    6-3. 서비스 계정 비밀번호 변경 후 연쇄 장애

    Glance, Nova, Neutron 같은 서비스 설정 파일에 들어간 자격 증명을 한쪽만 바꾸면 바로 연쇄적으로 인증 실패가 납니다. 이건 진짜 조심하셔야 합니다. 제가 한 번 maintenance window(점검 시간) 없이 낮에 바꿨다가 로그 쫓아다니느라 고생했습니다.

    팁: 비밀번호 변경은 다음 순서를 추천합니다.

    1. Keystone에서 사용자 비밀번호 변경
    2. 각 서비스 설정 파일 동시 반영
    3. 서비스 재시작 또는 재로드
    4. 토큰 발급과 서비스 API 호출 검증

    7. 검증: 운영 상태는 이렇게 확인했습니다

    설정을 바꿨으면 반드시 검증해야 합니다. 저는 아래 체크리스트를 반복적으로 썼습니다.

    1. 관리자 토큰 발급이 되는지 확인
    2. 일반 사용자 계정도 동일하게 인증되는지 확인
    3. 서비스 계정으로 API 인증이 되는지 확인
    4. public/internal endpoint가 의도대로 동작하는지 확인
    5. 로그에 경고나 반복 실패가 없는지 확인
    openstack token issue
    openstack endpoint list
    openstack catalog list
    openstack user list
    journalctl -u apache2 -n 100 --no-pager

    배포판에 따라 웹 서버 서비스명이 `httpd`일 수도 있습니다. 중요한 건 CLI 성공 여부와 서버 로그를 같이 보는 겁니다. 둘 중 하나만 보면 놓치는 게 생깁니다.

    OpenStack Keystone 운영 후기의 검증 단계에서 사용하는 토큰 발급 및 카탈로그 확인 이미지

    토큰 발급, 서비스 카탈로그, 엔드포인트 점검 결과를 한눈에 확인하는 운영 검증 예시입니다.

    1년 정도 운영하고 나니 확실히 느낀 점이 있습니다. Keystone은 화려한 서비스는 아니지만, 안정적으로 굴러가면 전체 OpenStack이 훨씬 단정해집니다. 반대로 인증 시스템 관리가 흐트러지면 장애 분석 시간도 길어지고, 보안 리스크도 조용히 쌓입니다.

    8. Fernet, 계정 관리, 엔드포인트 운영 기준 정리

    항목 권장 운영 방식 이유
    토큰 Fernet 사용, 키 회전 자동화 검증 구조 단순화와 보안성 확보
    계정 사람/서비스 계정 분리 감사 추적과 사고 범위 축소
    권한 최소 권한 부여 오남용 방지
    엔드포인트 public/internal 역할 분리 네트워크 정책 단순화
    시간 모든 노드 동기화 토큰 오류 예방
    전송 보안 TLS 적용 자격 증명 노출 방지

    9. 마무리: Keystone은 결국 운영 습관 싸움입니다

    정리해보면, OpenStack Keystone 운영 후기에서 가장 크게 남은 건 기술보다 습관이었습니다. 처음엔 설정만 맞으면 끝이라고 생각했는데, 실제로는 키 회전, 시간 동기화, 계정 분리, 엔드포인트 정리, 로그 확인을 꾸준히 반복해야 하더라고요. 드디어 됐다 싶어도 몇 달 지나면 또 운영 기준이 흐트러집니다. 그래서 체크리스트와 주기 작업이 중요합니다.

    혹시 지금 Keystone을 막 구축하셨거나, 이미 돌아가는 환경인데 어딘가 불안하신가요? 그럴 땐 거창한 개편보다 아래 5가지만 먼저 점검해보세요.

    • Fernet 키 회전이 되고 있는가
    • 시간 동기화가 정확한가
    • 서비스 계정과 사람 계정이 분리되어 있는가
    • 안 쓰는 public endpoint가 남아 있지 않은가
    • 토큰 발급 검증을 정기적으로 하고 있는가

    이 다섯 가지만 잡아도 체감이 꽤 큽니다. 다음 글에서는 Horizon과 Keystone 연동 시 세션/쿠키 문제, 또는 OpenStack 보안 관점에서 서비스 계정 순환(rotation) 자동화를 다뤄볼 예정입니다. 이전 글에서 다룬 네트워크 분리와 reverse proxy 구성이 있다면 같이 참고하시면 흐름이 더 잘 잡히실 겁니다.

    Fernet 키 회전, 최소 권한, TLS, 시간 동기화, 엔드포인트 정리를 요약한 운영 체크리스트입니다.

    자주 묻는 질문

    Keystone만 안정적이면 나머지 OpenStack 서비스도 괜찮을까요?

    완전히 그렇진 않지만, 최소한 인증 관련 장애 분석 범위를 크게 줄일 수 있습니다. 운영 체감상 출발점이 훨씬 깔끔해집니다.

    OpenStack 보안에서 가장 먼저 손댈 부분은 뭔가요?

    제가 직접 해보니 TLS, 계정 분리, Fernet 키 회전, 시간 동기화 이 네 가지가 우선순위가 높았습니다.

    인증 시스템 관리는 얼마나 자주 점검하면 좋을까요?

    주간 점검으로 토큰 발급과 로그 확인, 월간 점검으로 endpoint/role/서비스 계정 상태를 보는 식이 현실적이었습니다.