Instance Metadata Service 접근 제한하기
Instance Metadata Service 접근 제한하기
**Instance Metadata Service(IMDS)**에 대한 일부 또는 모든 프로세스의 접근을 비활성화하기 위해 로컬 방화벽 규칙을 사용하는 것을 고려할 수 있어요.
출처: 문서
본문
Nitro 기반 인스턴스의 경우, VPC 내의 네트워크 어플라이언스(예: 가상 라우터)가 패킷을 IMDS 주소로 전달하고 인스턴스의 기본 소스/대상 검사가 비활성화되어 있으면 IMDS에 자체 네트워크에서 도달할 수 있어요. VPC 외부의 소스가 IMDS에 도달하는 것을 방지하려면, 네트워크 어플라이언스의 구성을 수정해 대상 IPv4 주소가 IMDS의 169.254.169.254인 패킷(그리고 IPv6 엔드포인트를 활성화했다면 IMDS의 IPv6 주소 [fd00:ec2::254]인 패킷)을 **드롭(drop)**할 것을 권장합니다.
Linux 인스턴스의 IMDS 접근 제한 (Limit IMDS access for Linux instances)
iptables로 접근 제한하기
다음 예시는 Linux iptables와 그 owner 모듈을 사용해 Apache 웹 서버(기본 설치 사용자 ID가 apache)가 169.254.169.254에 접근하지 못하게 합니다. deny 규칙을 사용해 그 사용자로 실행되는 모든 프로세스의 모든 인스턴스 메타데이터 요청(IMDSv1과 IMDSv2 모두)을 거부합니다.
$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner --uid-owner apache --jump REJECT
또는 allow 규칙을 사용해 특정 사용자나 그룹에만 접근을 허용하는 것을 고려할 수 있어요. 보안 관점에서 allow 규칙이 관리하기 더 쉬울 수 있는데, 어떤 소프트웨어가 인스턴스 메타데이터에 접근해야 하는지 결정을 내려야 하기 때문이에요. allow 규칙을 사용하면 나중에 인스턴스의 소프트웨어나 구성을 변경해도 (접근을 의도하지 않은) 소프트웨어가 실수로 메타데이터 서비스에 접근하게 될 가능성이 낮아집니다. allow 규칙과 그룹 사용을 결합할 수도 있는데, 그러면 방화벽 규칙을 변경하지 않고 허용된 그룹에서 사용자를 추가·제거할 수 있어요.
다음 예시는 trustworthy-user 사용자 계정에서 실행되는 프로세스를 제외한 모든 프로세스의 IMDS 접근을 방지합니다.
$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner trustworthy-user --jump REJECT
참고
- 로컬 방화벽 규칙을 사용하려면 위 예시 명령을 필요에 맞게 수정해야 해요.
- 기본적으로 iptables 규칙은 시스템 재부팅 후에도 지속되지 않습니다. OS 기능을 사용해 지속되도록 할 수 있는데, 여기서는 설명하지 않아요.
- iptables
owner모듈은 그룹이 특정 로컬 사용자의 기본 그룹일 때만 그룹 구성원과 일치합니다. 다른 그룹은 일치하지 않아요.
PF 또는 IPFW로 접근 제한하기
FreeBSD나 OpenBSD를 사용한다면 PF나 IPFW를 사용하는 것도 고려할 수 있어요. 다음 예시는 IMDS 접근을 root 사용자로만 제한합니다.
PF
$ block out inet proto tcp from any to 169.254.169.254
$ pass out inet proto tcp from any to 169.254.169.254 user root
IPFW
$ allow tcp from any to 169.254.169.254 uid root
$ deny tcp from any to 169.254.169.254
참고: PF와 IPFW 명령의 순서가 중요해요. PF는 기본적으로 **마지막 일치 규칙(last matching rule)**을, IPFW는 **첫 번째 일치 규칙(first matching rule)**을 사용합니다.
Windows 인스턴스의 IMDS 접근 제한 (Limit IMDS access for Windows instances)
Windows 방화벽으로 접근 제한하기
다음 PowerShell 예시는 기본 제공 Windows 방화벽을 사용해 Internet Information Server(IIS) 웹 서버(기본 설치 사용자 ID가 NT AUTHORITY\IUSR)가 169.254.169.254에 접근하지 못하게 합니다. deny 규칙을 사용해 그 사용자로 실행되는 모든 프로세스의 모든 인스턴스 메타데이터 요청(IMDSv1과 IMDSv2 모두)을 거부합니다.
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("NT AUTHORITY\IUSR")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $BlockPrincipalSDDL = "D:(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service from IIS" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $BlockPrincipalSDDL
또는 allow 규칙을 사용해 특정 사용자나 그룹에만 접근을 허용하는 것을 고려할 수 있어요. allow 규칙이 보안 관점에서 관리하기 더 쉬울 수 있는데, 어떤 소프트웨어가 인스턴스 메타데이터에 접근해야 하는지 결정을 내려야 하기 때문이에요.
다음 예시는 blockPrincipal 변수에 지정된 OS 그룹(이 예시에서는 Windows 그룹 Everyone)으로 실행되는 모든 프로세스의 인스턴스 메타데이터 접근을 방지하며, exceptionPrincipal(이 예시에서는 trustworthy-users라는 그룹)에 지정된 프로세스는 예외로 합니다. deny과 allow principal을 모두 지정해야 해요. Windows 방화벽은 Linux iptables의 ! --uid-owner trustworthy-user 규칙과 달리, 다른 모든 것을 거부함으로써 특정 principal(사용자 또는 그룹)만 허용하는 단축 메커니즘을 제공하지 않기 때문입니다.
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("Everyone")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $exceptionPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("trustworthy-users")
PS C:\> $ExceptionPrincipalSID = $exceptionPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $PrincipalSDDL = "O:LSD:(D;;CC;;;$ExceptionPrincipalSID)(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service for $($blockPrincipal.Value), exception: $($exceptionPrincipal.Value)" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $PrincipalSDDL
참고: 로컬 방화벽 규칙을 사용하려면 위 예시 명령을 필요에 맞게 수정해야 해요.
netsh 규칙으로 접근 제한하기
netsh 규칙을 사용해 모든 소프트웨어를 차단하는 것을 고려할 수 있지만, 훨씬 덜 유연해요.
C:\> netsh advfirewall firewall add rule name="Block metadata service altogether" dir=out protocol=TCP remoteip=169.254.169.254 action=block
참고
- 로컬 방화벽 규칙을 사용하려면 위 예시 명령을 필요에 맞게 수정해야 해요.
- netsh 규칙은 관리자 권한 명령 프롬프트에서 설정해야 하며, 특정 principal을 거부하거나 허용하도록 설정할 수 없습니다.