のぴぴのメモ

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

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

はじめに

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

  • 結論
    • Amazon Linux : S3のVPC Endpointを設ける
    • RHEL : ForwardProxy(URLフィルタリング)を利用する

Amazon Linux1&2の場合

概要

Amazon Linuxyumリポジトリは、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

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/*"
      ]
    }
  ]
}

公式情報は、Amazon Linuxのよくある質問をご覧ください。

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を構成して、RHELyum設定(/etc/yum.conf)にプロクシ設定を追加しています。

Forward Proxy設定

フィルタリング対象URL

公式な情報はなさそうで、私が実機を確認した範囲の情報ですがRHELインスタンスの/etc/yum.repos.d/rhui-load-balancers.confを見ると、以下のURLにアクセスしているように見えます。

Forward Proxy設定

今回は手っ取り早く、squidを利用しています。

sudo yum -y install squid
# 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 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 )
rhui2-cds01.ap-northeast-1.aws.ce.redhat.com
rhui2-cds02.ap-northeast-1.aws.ce.redhat.com
sudo systemctl restart squid
RHELyumへのProxy設定
  • /etc/yum.conf (下記の設定を追記します。3128の部分は、squid.confのhttp_portの設定に従います)
proxy=http://<forward proxyのFQDN>:3128

インスタンスのユーザデータや、CloudFormationのcnf-initヘルパーなどでこの設定を追加するようにしておくと便利だと思います。

*1:他リージョンは、ap-northeast-1を置き換えます