のぴぴのメモ

自分用のLinuxとかの技術メモ

VPC閉塞網からyumリポジトリにアクセスする(Amazon Linux & RHEL)

はじめに

セキュリティなどの理由で、VPCからインターネットへの外の通信をさせないようにしている環境を想定した検証環境で、必要なパッケージ追加をしようとしてハマったのでまとめました。

  • 結論
    • Amazon Linux : S3のVPC Endpointを設ける
    • RHEL : ForwardProxy(URLフィルタリング)を利用する
  • 変更履歴
    • 2018.10.28 update: AL2の場合の設定がなかったので追記しました
    • 2020.9.20 update: RHELのRHUIのURLが変更されていたのでアップデートしました。
    • 2021.6.27 Amazon Linux2で、"arn:aws:s3:::amazonlinux-2-repos-/*"バケットへのアクセスも必要になっていたのでポリシーに追加しました。

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アクセス方法
    1. ForwardProxy(URLフィルタで制限)を利用する
    2. 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を置き換えます