이 문서에서는 Linux 가상 머신(VM) 인스턴스에 대한 SSH 네트워크 액세스를 제어하기 위한 권장사항을 설명합니다.
SSH를 사용하여 VM 인스턴스에 연결하려면 사용자에게 VM 인스턴스에 대한 네트워크 액세스 권한과 유효한 SSH 사용자 인증 정보가 필요합니다. 기본적으로 Compute Engine은 SSH 네트워크 액세스를 제한하지 않지만 인터넷에 있는 모든 사용자가 VM 인스턴스의 포트 22
에 연결할 수 있는 방화벽 규칙을 사용합니다. 개발자가 네트워크 또는 보안 제어를 고려하지 않고 빠르게 시작할 수 있지만 사용자가 모든 기기, 네트워크, 위치에서 연결할 수 있으면 위험이 발생합니다.
- 사용자가 신뢰할 수 없는 기기나 네트워크에서 연결할 수 있습니다.
- 악의적인 행위자는 무차별 대입 공격을 시작하고 VM 인스턴스를 손상시키려고 시도할 수 있습니다.
- 유출되거나 시간 내에 취소되지 않은 SSH 사용자 인증 정보에 대한 액세스 권한이 있는 악의적인 행위자는 사용자 인증 정보를 사용하여 모든 네트워크에서 VM에 액세스하고 로그인할 수 있습니다.
다음 섹션에서는 사용자가 VM에 SSH 연결을 설정할 수 있는 네트워크, 위치 또는 기기를 제한하여 위험을 줄이는 방법을 설명합니다.
이 문서는 Google Cloud에 한정된 관행이나 Google Cloud에서 SSH를 사용할 때 특별한 관련성이 있는 관행을 집중적으로 설명합니다. 이 문서에서는 특정 SSH 클라이언트 또는 서버 구현을 위한 권장사항을 설명하지 않습니다.
네트워크 노출 줄이기
사용자가 어디서나 SSH 연결을 설정할 수 있도록 허용하면 VM을 보호하는 데 전적으로 SSH 인증 및 승인 메커니즘을 사용할 수 있습니다. VM의 네트워크 노출을 줄여 위험을 줄이고 보안을 강화할 수 있습니다.
VM의 네트워크 노출을 줄이는 방법에는 여러 가지가 있습니다. 환경에 가장 적합한 방법을 파악하려면 다음 플로우 차트에 설명된 대로 여러 가지 요소를 고려해야 합니다.
외부 액세스: 가장 먼저 고려해야 하는 사항은 VPC 네트워크 내에서만 VM에 액세스해야 하는지 또는 외부에서 VM에 액세스해야 하는지 여부입니다.
VPC 내부 액세스로 충분하면 외부 IP 주소를 VM에 할당할 필요는 없지만 액세스 관리 방법을 결정해야 합니다.
내부 네트워크 크기: VPC 내부 액세스로 충분한 경우 두 번째 고려사항은 내부 네트워크 크기입니다.
소규모 네트워크의 경우 내부 주소에서 포트
22
로의 인그레스를 허용하는 방화벽 규칙을 사용하여 VM을 보호하는 것으로 충분할 수 있습니다. 대규모 네트워크에서는 방화벽 규칙만 사용하면 너무 제한적일 수 있습니다. 이러한 경우 IAP(Identity-Aware Proxy) TCP 전달을 사용하여 컨텍스트 인식 액세스를 VM에 적용하면 유용할 수 있습니다.VPC 서비스 제어 경계 설계: 다음으로 고려해야 하는 요소는 VM 인스턴스가 VPC 서비스 제어 경계에 속하는지 여부입니다.
VM이 서비스 경계에 속하면 VM에서 시작되는 모든 API 액세스는 경계 내에서 시작되는 것으로 간주됩니다. 경계 외부에 있는 사용자에게 경계 내부의 VM에 대한 SSH 액세스 권한을 부여하면 사용자가 데이터를 경계에서 로컬 워크스테이션으로 복사하거나 다른 방향으로 복사할 수 있습니다. 이로 인해 경계 데이터의 기밀성 및 무결성이 손상될 수 있습니다.
VPC 서비스 제어 경계에 속하는 VM 인스턴스에 대한 SSH 액세스 권한을 부여해야 할 때마다 IAP TCP 전달을 사용합니다. IAP는 사용자 워크스테이션이 같은 VPC 서비스 제어 경계에 속하는지 여부를 감지하고 기본적으로 서비스 경계 외부에서의 액세스 시도를 차단합니다. 외부 액세스를 허용하려면 인그레스 규칙을 사용하고 컨텍스트 인식 액세스를 적용하도록 구성합니다.
클라이언트 기기 관리: 마지막으로 고려해야 하는 요소는 클라이언트 기기의 관리 방법입니다. 컨텍스트 인식 액세스를 제어하는 방법이 결정되기 때문입니다.
컨텍스트 인식 액세스는 Access Context Manager가 사용자, 사용자 기기, 사용자 위치에 대한 다양한 신호에 액세스할 수 있어 Chrome Enterprise Premium과 함께 작동할 때 가장 효과적입니다. Chrome Enterprise Premium을 사용하여 기기를 관리하는 경우 기기 상태에 따라 액세스를 제어하는 액세스 수준을 설정할 수 있습니다. 그런 다음 IAP TCP 전달을 액세스 바인딩 또는 IAM 조건과 함께 사용하여 이 액세스 수준을 SSH 액세스에 적용할 수 있습니다.
클라이언트 기기 구성을 제어하지 않는 경우에는 관리되지 않으며 신뢰할 수 없는 것으로 간주해야 합니다.
관리되지 않는 기기에서 액세스를 허용하기 위해 IAP TCP 전달을 사용할 수도 있지만 사용자 ID 및 기기의 IP 주소를 기반으로만 액세스를 관리할 수 있습니다. Access Context Manager에는 기기 신호에 대한 액세스 권한이 없으므로 기기 상태를 기준으로 액세스를 제한할 수 없습니다.
이러한 요소를 토대로 플로우 차트를 사용하여 환경에 가장 적합한 네트워크 노출 감소 방법을 파악할 수 있습니다. 다음 섹션에서는 이러한 방법을 자세히 설명합니다.
IAP 기반 SSH 액세스
이 방법의 개념은 IAP TCP 전달을 통한 SSH 액세스만 허용하고 IAP에서 사용자 ID를 기반으로 액세스를 제어하도록 하는 것입니다.
다음이 적용되는 VM 인스턴스에 이 방법을 사용하는 것이 좋습니다.
- 외부 또는 대규모 내부 네트워크에서 VM 인스턴스에 액세스할 수 있어야 합니다.
- VM이 VPC 서비스 제어 경계에 속하지 않습니다.
기본적으로 외부 IP 주소가 있는 VM 인스턴스는 기본 방화벽이 공개 인터넷에서 포트 22로의 연결을 허용하므로 SSH 액세스를 허용하지만 이는 권장되지 않는 방법입니다. 이 방법은 VM이 다음과 같은 공격에 노출될 위험을 크게 높일 수 있습니다.
- 취소되지 않은 사용자 인증 정보 사용: 액세스 권한이 완전히 취소되지 않은 퇴사 직원이 계속해서 VM에 액세스할 수 있습니다.
- 유효한 사용자 인증 정보 악용: 도난되거나 유출된 사용자 인증 정보를 소유한 악의적인 행위자가 이를 사용하여 로그인할 수 있습니다.
- 서비스 거부: 악의적인 행위자가 요청을 과도하게 전송하여 VM 리소스를 소진하려고 시도할 수 있습니다.
VM 인스턴스에 대한 외부 SSH 액세스를 사용 설정하는 안전한 방법은 IAP TCP 전달을 사용하는 방법입니다. 배스천 호스트 또는 리버스 프록시와 마찬가지로 IAP TCP 전달은 클라이언트 기기와 VM 간의 중개자 역할을 합니다.
IAP TCP 전달은 사용자가 SSH 연결 설정을 시도할 때 다음 4가지 기능을 수행합니다.
- 인증: IAP는 사용자가 유효한 Google 사용자 인증 정보를 소유하고 있는지 확인합니다.
- 승인: IAP는 IAM 정책을 검사하여 사용자에게 IAP를 통해 VM에 연결할 수 있는 권한이 부여되었는지 확인합니다.
- 컨텍스트 인식 액세스: 원하는 경우 IAP에서 사용자, 기기, 위치가 특정 액세스 수준을 충족하는지 확인할 수 있습니다.
- 감사: 데이터 액세스 로그가 사용 설정되면 IAP에서 VM 인스턴스에 연결하려는 성공 및 실패 시도를 각각 기록합니다.
IAP는 중개자 역할을 하고 이러한 기능을 수행하므로 VM에 외부 IP 주소를 할당할 필요가 없으며 보안이 강화됩니다.
IAP 기반 컨텍스트 인식 SSH 액세스
이 방법의 기본 개념은 IAP TCP 전달을 통해서만 SSH 액세스를 허용하고 IAP에서 사용자 ID 및 추가 요소를 기반으로 액세스를 제어하도록 하는 것입니다.
다음이 적용되는 VM 인스턴스에 이 방법을 사용하는 것이 좋습니다.
- VPC 외부와 VPC에 연결된 네트워크에서 VM 인스턴스에 액세스할 수 있어야 합니다.
- VM이 VPC 서비스 제어 경계에 속하지 않습니다.
- 특정 기기, 네트워크 또는 위치에서만 VM에 액세스할 수 있어야 합니다.
직접 또는 IAP를 통해 사용자에게 VM 인스턴스에 대한 SSH 액세스 권한을 부여하면 기본적으로 모든 기기, 네트워크, 위치에서 VM 인스턴스에 액세스할 수 있습니다. 사용자에게는 편리하지만 이 수준의 액세스 권한을 통해 사용자가 손상된 기기나 신뢰할 수 없는 네트워크에서 연결할 수 있으므로 위험이 증가합니다.
위험을 줄이려면 사용자가 특정 기기나 위치에서만 VM 인스턴스에 액세스할 수 있도록 IAP TCP 전달을 구성합니다. 다음 두 가지 방법으로 이러한 컨텍스트 인식 액세스를 구성할 수 있습니다.
액세스 바인딩: 액세스 수준을 만들고 액세스 바인딩을 사용하여 그룹에 할당할 수 있습니다. 액세스 바인딩은 양식이거나 ID 기반 정책이며 IAP뿐만 아니라 다른 API 및 Google Cloud 콘솔 등 사용자가 액세스하려는 모든 리소스에 적용됩니다.
컨텍스트 인식 액세스가 리소스 전체에 균일하게 적용되게 하려면 액세스 바인딩을 사용하는 것이 좋습니다.
IAM 조건: IAM 조건을 사용하여 액세스 수준을 만들고 개별 IAM 역할 바인딩에 할당할 수 있습니다.
IAM 역할 바인딩 사용은 리소스 기반 정책 양식이며 이 방법은 VM 집합마다 서로 다른 정책을 적용하려는 경우에 가장 적합합니다.
기본 액세스 수준을 사용하면 네트워크나 지리적 위치별로 액세스를 제한할 수 있습니다. 또한 Chrome Enterprise Premium 구독자는 사용자 인증 정보 강도, 인증에 사용된 브라우저의 구성 또는 기기 상태와 같은 다른 속성을 기반으로 액세스를 제한할 수도 있습니다.
VPC 서비스 제어 기반 SSH 액세스
이 방법의 개념은 IAP TCP 전달을 통한 SSH 액세스만 허용하고 소스의 특정 ID에 대한 IAP 인그레스를 허용하도록 서비스 경계를 구성하는 것입니다.
VPC 서비스 제어 경계에 속하는 VM 인스턴스에 이 방법을 사용하는 것이 좋습니다.
사용자에게 서비스 경계에 속하는 VM에 대한 외부 SSH 액세스 권한을 부여하면 사용자가 SSH를 통해 데이터를 유출하여 VPC 서비스 제어 경계를 손상시킬 수 있으므로 위험해질 수 있습니다.
IAP TCP 전달을 통해 SSH 액세스만 허용하면 이러한 위험을 줄이고 모든 SSH 액세스에 VPC 서비스 제어 경계 구성이 적용되도록 할 수 있습니다.
- 사용자가 서비스 경계 외부에서 연결하려고 시도하는 경우(앞선 예시와 같이) IAP TCP 전달은 사용자에게 VM에 대한 IAM 액세스 권한이 부여되었는지 확인할 뿐만 아니라 요청이 경계의 인그레스 규칙을 충족하는지도 확인합니다.
사용자가 서비스 경계 내에서 연결하려고 시도하면 IAP TCP 전달은 사용자에게 VM에 대한 IAM 액세스 권한이 부여되었는지 확인하지만 VPC 서비스 제어 인그레스 규칙을 무시합니다.
IAP는 다음 중 하나라도 적용되면 서비스 경계 내부에서 시작되는 연결을 간주합니다.
- 소스 IP는 서비스 경계에 속하는 VM의 외부 IP 주소입니다.
- 연결은 서비스 경계에 속하는 VM에서 비공개 Google 액세스를 통해 수행됩니다.
- 연결은 서비스 경계에 속하는 Private Service Connect 액세스 엔드포인트를 통해 수행됩니다.
방화벽으로 제어되는 내부 SSH 액세스
이 방법의 개념은 모든 외부 액세스를 허용하지 않고 VPC 내부 SSH 액세스만 허용하는 것입니다.
다음에 해당하는 VM 인스턴스에 이 방법을 사용할 수 있습니다.
- 외부에서 VM 인스턴스에 액세스하지 않아도 됩니다.
- VM이 중소 규모의 내부 네트워크에 연결됩니다.
- VM이 VPC 서비스 제어 경계에 속하지 않습니다.
모든 외부 액세스를 허용하지 않으려면 다음 중 하나를 수행하면 됩니다.
- 외부 IP 주소가 없는 VM 인스턴스를 배포합니다.
- VPC 외부의 IP 범위에서 인그레스 SSH 트래픽이 허용되지 않도록 방화벽 규칙을 구성합니다.
직렬 콘솔 액세스 중지
오작동하는 VM 인스턴스 문제를 해결하려면 Compute Engine을 사용하여 SSH 게이트웨이 ssh-serialport.googleapis.com
을 통해 인스턴스의 직렬 포트 콘솔에 연결하면 됩니다.
인터넷을 통해 이 게이트웨이에 공개적으로 액세스할 수 있습니다.
SSH 게이트웨이는 VPC 네트워크 대신 기본 하이퍼바이저를 통해 VM에 액세스합니다. 따라서 직렬 콘솔에 대한 액세스는 방화벽 규칙이 아닌 IAM 정책에서 제어됩니다.
사용자가 VM 직렬 콘솔에 액세스하도록 허용하면 의도치 않게 VM이 과도하게 노출될 수 있습니다. 이러한 과도한 노출을 방지하려면 compute.disableSerialPortAccess
조직 정책 제약조건을 사용하여 직렬 콘솔 액세스를 중지하고 VM의 직렬 포트에 긴급 액세스가 필요한 경우 제약조건을 일시적으로 해제합니다.
세션을 기록해야 하는 경우 배스천 VM 사용
IAP TCP 전달은 클라이언트 기기와 VM 사이에서 중개자 역할을 하여 배스천 호스트나 점프 서버에서 일반적으로 수행하는 기능을 수행합니다. 이러한 함수에는 다음이 포함됩니다.
- 중앙 집중식 방식으로 액세스 정책 적용
- 액세스 감사
일부 배스천 호스트와 달리 IAP TCP 전달은 SSH 연결을 종료하지 않습니다. IAP TCP 전달을 통해 VM에 대한 SSH 연결을 설정하면 SSH 연결이 클라이언트와 VM 사이에서 엔드 투 엔드로 암호화됩니다. 이러한 엔드 투 엔드 암호화로 인해 IAP TCP 전달에서 SSH 세션 콘텐츠를 검사할 수 없으며 세션 기록 기능을 제공하지 않습니다. IAP 감사 로그에는 연결 메타데이터가 포함되지만 세션 콘텐츠에 관한 정보는 표시되지 않습니다.
세션을 기록해야 하는 경우 배스천 VM을 사용합니다.
- 배스천 VM에서 SSH 연결을 종료하고 콘텐츠를 기록하도록 구성합니다. SSH 포트 전달을 사용하면 세션 기록 효과가 저하될 수 있으므로 사용을 제한해야 합니다.
- SSH 연결이 배스천 VM에서만 허용되도록 대상 VM 방화벽 규칙을 설정합니다.
- IAP TCP 전달을 통해서만 배스천 VM에 대한 액세스 허용
방화벽 정책을 사용하여 SSH 노출 제한
환경에 가장 적합한 SSH 노출 제한 방법을 결정한 후에는 모든 VM 및 프로젝트가 그에 따라 구성되었는지 확인해야 합니다. 특히 모든 프로젝트에서 SSH 사용 방법을 결정하는 일관된 방화벽 규칙 집합을 사용해야 합니다.
여러 프로젝트에서 일련의 방화벽 규칙을 적용하려면 계층식 방화벽 정책을 사용하고 리소스 계층 구조의 폴더에 적용합니다.
예를 들어 모든 SSH 액세스가 IAP TCP 전달을 통해 수행되도록 하려면 다음 두 가지 커스텀 규칙이 포함된 방화벽 정책을 우선순위에 따라 적용합니다.
35.235.240.0/20
에서 선택한 VM의 포트 22로의 인그레스를 허용합니다.35.235.240.0/20
은 IAP TCP 전달에서 사용하는 IP 범위입니다.0.0.0.0/0
에서 모든 VM의 포트 22로의 인그레스를 거부합니다.
다음 단계
- SSH 로그인 액세스 제어 권장사항 계속 읽어보기