はじめに
セキュリティなどの理由で、VPCからインターネットへの外の通信をさせないようにしている環境を想定した検証環境で、必要なパッケージ追加をしようとしてハマったのでまとめました。
Amazon Linux1&2の場合
概要
Amazon Linuxのyumリポジトリは、S3が利用されています。ですので、S3用のVPC Endpointを作ることでInternet Gatewayを介さずにyumリポジトリにアクセスすることができるようになります。
VPC Endpoint(S3)の設定
VPCに、S3用のVPC Endpointを作成して、yumリポジトリ用のS3バスケット(下記の2個)にからオプジェクトをGetできるようにします。
- (AmazonLinux)yumリポジトリのS3バスケット
- packages.Region Code.amazonaws.com/*",
- repo.Region Code.amazonaws.com/*"
- (AmazonLinux2)yumリポジトリのS3バスケット
- amazonlinux.Region Code.amazonaws.com
- amazonlinux-2-repos-Region Code ※2021.6頃以降はこちらに変更された模様
Endpointのポリシーには以下のような設定をします。より厳密にするためには、amazonの前の"*"を各リージョンのコード(例えば東京リージョンの場合、ap-northeast-1)とします。
{ "Statement": [ { "Sid": "Amazon Linux AMI Repository Access", "Principal": "*", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::packages.*.amazonaws.com/*", "arn:aws:s3:::repo.*.amazonaws.com/*", "arn:aws:s3:::amazonlinux.*.amazonaws.com/*", "arn:aws:s3:::amazonlinux-2-repos-<B>Region Code</B>/*"" ] } ] }
公式情報は、Amazon Linuxのよくある質問をご覧ください。
上記のVPCエンドポイントポリシーを作成するCloudFormationのサンプルです
S3VpcEndpoint: Type: AWS::EC2::VPCEndpoint Properties: VpcId: !Ref Vpc ServiceName: !Sub com.amazonaws.${AWS::Region}.s3 RouteTableIds: - !Ref RouteTable1 - !Ref RouteTable2 PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: '*' Action: - 's3:*' Resource: # Allow connections to the Amazon Linux yum repositories - "arn:aws:s3:::packages.*.amazonaws.com/*" - "arn:aws:s3:::repo.*.amazonaws.com/*" # Allow connections to the Amazon Linux2 yum repositories - "arn:aws:s3:::amazonlinux.*.amazonaws.com/*" - Fn::Join: - "" - - "arn:aws:s3:::amazonlinux-2-repos-" - !Sub "${AWS::Region}" - "/*"
RHELの場合
概要
License includedなRHELを利用した場合のパッケージ管理は、Red Hat Update Infrastructure (RHUI) を利用します。
Q: Red Hat Enterprise Linux を実行中の Amazon EC2 インスタンス用に、更新や定期的なパッチを受け取るにはどのようにすればよいですか?
Red Hat Update Infrastructure (RHUI) が Red Hat によってそれぞれの AWS リージョンでメンテナンスされており、定期的なアップデートとパッチを利用できます。Red Hat Enterprise Linux インスタンスはリージョンごとのリポジトリにアクセスして差分更新を受信することができます。またすべては料金に含まれています。
AWSのRHUIの場合、パブリックなネットワーク上にRHUIサーバーがいるようで、どうしてもインターネットアクセスが必要になります。VPCに閉じることに拘らない場合は、NATGWをつけてしまえば良いですが、要件的にそれが難しい場合取りうる手段としては以下の2つが考えられると思います。
- VPCの外に簡単に出れない環境でのRHUIアクセス方法
- ForwardProxy(URLフィルタで制限)を利用する
- RHUIのyumリポジトリのコピーをVPC内に設ける
ただ「yumリポジトリのコピーをVPC内に設ける」案は、(1)RHUIからのリポジトリコピーをどうやるかという技術的課題と、(2)コピーしたyumリポジトリ上のrpmパッケージのredhatライセンス上の解釈が判断つかない、という理由から今回は「RHUIのyumリポジトリのコピーをVPC内に設ける」方法を取っています。
具体的には、public subnetにproxyを構成して、RHELのyum設定(/etc/yum.conf)にプロキシ設定を追加しています。
Forward Proxy設定
フィルタリング対象URL
公式な情報はなさそうで、私が実機を確認した範囲の情報ですがRHELインスタンスの/etc/yum.repos.d/rhui-load-balancers.confを見ると、以下のURLにアクセスしているように見えます。
- rhui2-cds01.
.aws.ce.redhat.com - rhui2-cds02.
.aws.ce.redhat.com
[2020.9.20追記]
詳細わかりませんが、最近動かしたらRHUIのURLが以下に変更されてたので追記します。(URLから推測するに、RHUI2からRHUI3にアップデートしたんですかね)
- rhui3.REGION.aws.ce.redhat.com
Forward Proxy設定
今回は手っ取り早く、squidを利用しています。
- (1) squidのrpmのインストール
sudo yum -y install squid
- (2) squid設定
- /etc/squid/squid.conf
# define ip address acl localnet src 127.0.0.0/8 acl localnet src ::1/128 acl SSL_ports port 443 acl Safe_ports port 443 # https acl CONNECT method CONNECT # Deny CONNECT to other than secure SSL ports http_access deny !Safe_ports http_access deny CONNECT !SSL_ports # Only allow cachemgr access from localhost http_access allow localhost manager http_access deny manager # from where browsing should be allowed http_access allow localnet # include url white list acl whitelist dstdomain "/etc/squid/whitelist" http_access allow whitelist # And finally deny all other access to this proxy http_access deny all #------------------------------------------ http_port 0.0.0.0:3128 # Leave coredumps in the first cache dir coredump_dir /var/spool/squid # anonymouse host name visible_hostname unknown # change log format logformat squid %tl %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
-
- /etc/squid/whitelist(東京リージョンの場合*1 )
#For RHUI2 rhui2-cds01.ap-northeast-1.aws.ce.redhat.com rhui2-cds02.ap-northeast-1.aws.ce.redhat.com #For RHUI3( Added on Sep. 20, 2020) rhui3.ap-northeast-1.aws.ce.redhat.com
- (3) squidの再起動
sudo systemctl restart squid
RHELのyumへのProxy設定
- /etc/yum.conf (下記の設定を追記します。3128の部分は、squid.confのhttp_portの設定に従います)
proxy=http://<forward proxyのFQDNまたはIP>:3128
インスタンスのユーザデータや、CloudFormationのcnf-initヘルパーなどでこの設定を追加するようにしておくと便利だと思います。
*1:他リージョンは、ap-northeast-1を置き換えます