SquidとNLBとEFSを使って認証プロキシサーバーを冗長化してみた

SquidとNLBとEFSを使って認証プロキシサーバーを冗長化してみました。 NLBを使って、Multi-AZ構成にした認証プロキシサーバーにアクセスを振り分けています。 また、プロキシサーバーへの認証方式として、Digest認証を使用しています。 EFSは認証用のパスワードをハッシュ化したファイルを保存し、各認証プロキシサーバーがユーザー認証時にアクセスできるようにしています。
2021.09.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

認証プロキシサーバーを冗長化したい時ってありますよね

こんにちは、のんピ(@non____97)です。

皆さんはプロキシサーバー使っていますか? 私はそんなに使っていません。

使わない理由としては、単純にインターネットに出るためだけであれば、NAT Gatewayを使えば良いと思いますし、VPC Flow Logsでtcp/ipレベルのログを確認できるからです。

仮に、「URLフィルタリングもしたい!!」や「HTTPのログも見たい!!」となった場合は、Network Firewallを導入することで対応できます。

しかし、「認証したユーザーしか通信させたくない!!」といった要望を叶えるサービスは現時点では提供されていません。そこで、「それじゃあSquidを使って認証プロキシサーバーを作ろう!!」となると思います。

ここで注意しておきたいポイントがプロキシサーバーの可用性です。プロキシサーバーのように、通信経路上にリソースを配置するインライン構成になる場合、そのリソースが停止した際の影響が大きくなってしまいます。

そのため、今回は認証プロキシサーバーをMulti-AZで配置し、NLBを使って冗長化させます。

また、プロキシの認証の方式は、よく聞くBasic認証ではなく、Digest認証で実装します。(なんとなく)

いきなりまとめ

  • Digest認証はBasic認証の様にパスワードが平文で流れない
    • しかし、中間者攻撃に脆弱性がある
    • また、パスワードはハッシュ化されているが、ユーザーID及びハッシュ値が漏洩すると第三者から不正に認証される可能性がある
  • NLBを認証プロキシサーバーとクライアントの間に挟むことによって、アクセスが負荷分散される
  • プロキシ認証用ユーザーの追加した際に、Squidのサービス再起動や設定のリロードは不要
  • Auto Scallingを組み合わせると、より可用性を向上させることもできる

Digest認証とは

Digest認証(ダイジェスト認証)とは、HTTPで定義される認証方式の一つです。

認証方式でよく知られているBasic認証では、平文でユーザーIDとパスワードを送信してしまう欠点があります。当然、平文で認証情報を流してしまうと、盗聴や改ざんされる可能性が大きくなります。

Digest認証は、この欠点を改善した認証方式で、パスワードをハッシュ化して送信します。

Digest認証はRFC 7616に仕様が記載されています。Digest認証を使ってプロキシ認証をするフローは以下の通りです。

  1. クライアントがプロキシ認証が必要なURIをリクエストする。
  2. 認証プロキシサーバーはHTTPステータスコード407(Proxy Authentication Required)で、Proxy-Authenticateヘッダーに以下の情報を追加し、クライアントにレスポンスを返す。
    • type: 認証方式。今回の場合はDigest認証なので、Digest
    • realm: 使用するユーザー名とパスワードをユーザーに知らせるためにユーザーに表示する文字列
    • nonce: サーバー側で生成したランダムな文字列
    • opaque: ランダムに生成されるデータ
    • stale: nonceが古いことが原因で、クライアントから要求が拒否されたことを示すフラグ
    • algorithm: Digestを生成するために使用されるアルゴリズムを示す文字列
    • qop: Quality of protectionの略で、authもしくはauth-intのどちらかを渡す。auth-intの場合、ボディも後述するresponseの計算に使われる。
  3. HTTPステータスコード407を受け付けたクライアントは、Proxy-Authorizationヘッダーに以下の情報を追加し、リクエストを再試行する。
    • response: 以下のように計算された16進数の文字列
    • A1 = unq(username) ":" unq(realm) ":" < user's password >
      A2 = Method ":" request-uri ":" H(entity-body)
      response = <"> < KD ( H(A1), unq(nonce)
                                      ":" nc
                                      ":" unq(cnonce)
                                      ":" unq(qop)
                                      ":" H(A2)
                              ) <">
    • username: 指定されたrealm内のユーザーの名前
    • realm: Proxy-Authenticateヘッダーで説明した内容と同じ
    • URI: HTTPリクエストの有効なリクエストURI
    • qop: Proxy-Authenticateヘッダーで説明した内容と同じ
    • cnonce: クライアント側で生成したランダムな文字列
    • nc: クライアントが同じnonceを使用した回数をカウントする値
  4. 認証プロキシサーバー側で、Proxy-Authorizationヘッダーに含まれる値とサーバー内に保存されているパスワードなどからresponseを計算し、クライアントから送られてきたresponseと一致する場合に、認証成功とする。

認証フローを確認すると、確かにパスワードは平文で送信されていないですね。

しかし、Digest認証には以下の通り、中間者攻撃に脆弱性があります。

5.8. Man-in-the-Middle Attacks

Digest Authentication is vulnerable to man-in-the-middle (MITM) attacks, for example, from a hostile or compromised proxy. Clearly, this would present all the problems of eavesdropping. But, it also offers some additional opportunities to the attacker.

A possible man-in-the-middle attack would be to add a weak authentication scheme to the set of choices, hoping that the client will use one that exposes the user's credentials (e.g., password). For this reason, the client SHOULD always use the strongest scheme that it understands from the choices offered.

An even better MITM attack would be to remove all offered choices,replacing them with a challenge that requests only Basic authentication, then uses the cleartext credentials from the Basic authentication to authenticate to the origin server using the stronger scheme it requested. A particularly insidious way to mount such a MITM attack would be to offer a "free" proxy caching service to gullible users.

User agents should consider measures such as presenting a visual indication at the time of the credentials request of what authentication scheme is to be used, or remembering the strongest authentication scheme ever requested by a server and producing a warning message before using a weaker one. It might also be a good idea for the user agent to be configured to demand Digest authentication in general or from specific sites.

Or, a hostile proxy might spoof the client into making a request the attacker wanted rather than one the client wanted. Of course, this is still much harder than a comparable attack against Basic Authentication.

RFC 7616 - HTTP Digest Access Authentication

機械翻訳の結果は以下の通りです。

ダイジェスト認証は、敵対的なプロキシや危険なプロキシからの中間者(MITM)攻撃に弱い。 明らかに、これは盗聴のすべての問題を引き起こすでしょう。しかし、攻撃者にとっては新たなチャンスでもあります。

中間者攻撃として考えられるのは、弱い認証方式を選択肢に加え、ユーザーの認証情報(パスワードなど)を公開するものをクライアントが使用することを期待することです。 このため、クライアントは常に、提示された選択肢の中から自分が理解できる最強のスキームを使用すべきです(SHOULD)。

さらに優れたMITM攻撃は、提示されたすべての選択肢を削除し、Basic認証のみを要求するチャレンジに置き換え、Basic認証から得られた平文の認証情報を使用して、要求されたより強力なスキームを使用してオリジン・サーバを認証することです。 このようなMITM攻撃を行うための特に狡猾な方法は、騙されやすいユーザに「無料」のプロキシ・キャッシング・サービスを提供することです。

ユーザエージェントは、認証情報を要求する際に、どのような認証方式を使用するかを視覚的に示すことや、これまでにサーバから要求された最も強い認証方式を記憶しておき、弱い認証方式を使用する前に警告メッセージを表示するなどの対策を検討する必要があります。 また、一般的に、あるいは特定のサイトからダイジェスト認証を要求するようにユーザ・エージェントを設定することもよい考えである。

あるいは、敵対的なプロキシが、クライアントになりすまして、クライアントが望むリクエストではなく、攻撃者が望むリクエストを行うかもしれません。 もちろん、これはベーシック認証に対する同等の攻撃よりもはるかに困難です。

こちらのDigest認証に対する中間者攻撃のデモは徳丸先生がYouTubeで解説しています。

また、パスワードはハッシュ化されていますが、ユーザー名及びハッシュ値が漏洩すると第三者から不正に認証される可能性があります。こちらも、徳丸先生がYouTubeでデモを交えて解説しています。

検証の環境

今回の検証の構成図は以下の通りです。

検証環境構成図

認証プロキシサーバーとして、Squidを2台のEC2インスタンスにインストール・設定します。 そして、2台のEC2インスタンスをMulti-AZ構成にしてNLBで負荷分散されてるように構築します。

また、EFSファイルシステムはプロキシ認証用ユーザーの情報を保存し、各認証プロキシサーバーが認証時にアクセスできるようにしています。

各種リソースのデプロイ

各EC2インスタンスやNLB、EFSファイルシステムなどの環境一式をAWS CDKでデプロイします。

AWS CDKの実行環境のディレクトリの構成は以下の通りです。

> tree
.
├── .gitignore
├── .npmignore
├── README.md
├── bin
│   └── proxy-app.ts
├── cdk.context.json
├── cdk.json
├── jest.config.js
├── lib
│   └── proxy-app-stack.ts
├── package-lock.json
├── package.json
├── src
│   ├── cloudWatch
│   │   └── AmazonCloudWatch-linux.json
│   └── ec2
│       └── userDataSettingSquid.sh
├── test
│   └── proxy-app.test.ts
└── tsconfig.json

6 directories, 14 files

メインで動かすのは./lib/proxy-app-stack.tsです。ここで全てのリソースを作成しています。

./lib/proxy-app-stack.tsの大まかな処理の流れは以下の通りです。

  • SSM用のIAMロールの作成
  • VPCの作成
  • SSM用のVPCエンドポイントの作成
    • com.amazonaws.region.ssm
    • com.amazonaws.region.ec2messages
    • com.amazonaws.region.ssmmessages
    • com.amazonaws.region.s3
  • 認証プロキシサーバー用EC2インスタンスとEFSファイルシステム用のセキュリティグループの作成
  • NLBの作成
  • 認証プロキシサーバー用EC2インスタンスの作成
  • クライアント用のEC2インスタンスの作成
  • CloudWatch Agentの設定のSSMパラメーターストアへのアップロード
  • EFSファイルシステムの作成

実際のコードは以下の通りです。

./lib/proxy-app-stack.ts

import * as cdk from "@aws-cdk/core";
import * as ec2 from "@aws-cdk/aws-ec2";
import * as iam from "@aws-cdk/aws-iam";
import * as elbv2 from "@aws-cdk/aws-elasticloadbalancingv2";
import * as ssm from "@aws-cdk/aws-ssm";
import * as efs from "@aws-cdk/aws-efs";
import * as fs from "fs";

export class ProxyAppStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Create SSM IAM role
    const ssmIamRole = new iam.Role(this, "SsmIamRole", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
      managedPolicies: [
        iam.ManagedPolicy.fromAwsManagedPolicyName(
          "AmazonSSMManagedInstanceCore"
        ),
        iam.ManagedPolicy.fromAwsManagedPolicyName(
          "CloudWatchAgentAdminPolicy"
        ),
      ],
    });

    // Create a VPC
    const vpc = new ec2.Vpc(this, "Vpc", {
      cidr: "10.0.0.0/24",
      enableDnsHostnames: true,
      enableDnsSupport: true,
      maxAzs: 2,
      natGateways: 2,
      subnetConfiguration: [
        {
          name: "Public",
          subnetType: ec2.SubnetType.PUBLIC,
          cidrMask: 27,
        },
        {
          name: "Private",
          subnetType: ec2.SubnetType.PRIVATE_WITH_NAT,
          cidrMask: 27,
        },
        {
          name: "Isolated",
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
          cidrMask: 27,
        },
      ],
    });

    // Create SSM Privatelink
    new ec2.InterfaceVpcEndpoint(this, "SsmVpcEndpoint", {
      vpc: vpc,
      service: ec2.InterfaceVpcEndpointAwsService.SSM,
      subnets: vpc.selectSubnets({ subnetGroupName: "Isolated" }),
    });

    // Create SSM MESSAGES Privatelink
    new ec2.InterfaceVpcEndpoint(this, "SsmMessagesVpcEndpoint", {
      vpc: vpc,
      service: ec2.InterfaceVpcEndpointAwsService.SSM_MESSAGES,
      subnets: vpc.selectSubnets({ subnetGroupName: "Isolated" }),
    });

    // Create EC2 MESSAGES Privatelink
    new ec2.InterfaceVpcEndpoint(this, "Ec2MessagesVpcEndpoint", {
      vpc: vpc,
      service: ec2.InterfaceVpcEndpointAwsService.EC2_MESSAGES,
      subnets: vpc.selectSubnets({ subnetGroupName: "Isolated" }),
    });

    // // Create S3 Gateway
    new ec2.GatewayVpcEndpoint(this, "S3GatewayVpcEndpoint", {
      vpc: vpc,
      service: ec2.GatewayVpcEndpointAwsService.S3,
    });

    // Create Security Group
    // For Proxy
    const proxySg = new ec2.SecurityGroup(this, "ProxySg", {
      allowAllOutbound: true,
      vpc: vpc,
    });
    proxySg.addIngressRule(ec2.Peer.ipv4(vpc.vpcCidrBlock), ec2.Port.tcp(8080));

    // For EFS
    const efsSg = new ec2.SecurityGroup(this, "EfsSg", {
      allowAllOutbound: true,
      vpc: vpc,
    });
    efsSg.addIngressRule(ec2.Peer.ipv4(vpc.vpcCidrBlock), ec2.Port.tcp(2049));

    // Create NLB
    const nlb = new elbv2.NetworkLoadBalancer(this, "Nlb", {
      vpc: vpc,
      vpcSubnets: vpc.selectSubnets({ subnetGroupName: "Private" }),
      crossZoneEnabled: true,
      internetFacing: false,
    });

    // Create NLB Target group
    const targetGroup = new elbv2.NetworkTargetGroup(this, "TargetGroup", {
      vpc: vpc,
      port: 8080,
      targetType: elbv2.TargetType.INSTANCE,
    });

    // Create NLB listener
    const listener = nlb.addListener("Listener", {
      port: 8080,
      defaultTargetGroups: [targetGroup],
    });

    // User data for Amazon Linux
    const userDataParameter = fs.readFileSync(
      "./src/ec2/userDataSettingSquid.sh",
      "utf8"
    );
    const userDataSettingPostfix = ec2.UserData.forLinux({
      shebang: "#!/bin/bash",
    });
    userDataSettingPostfix.addCommands(userDataParameter);

    // Create EC2 Instances
    // Proxy Server
    vpc
      .selectSubnets({ subnetGroupName: "Private" })
      .subnets.forEach((subnet: ec2.ISubnet, index: number) => {
        const ec2Instance = new ec2.Instance(
          this,
          `ProxyEc2Instance-${index}`,
          {
            machineImage: ec2.MachineImage.latestAmazonLinux({
              generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
            }),
            instanceType: new ec2.InstanceType("t3.micro"),
            vpc: vpc,
            role: ssmIamRole,
            vpcSubnets: vpc.selectSubnets({
              subnetGroupName: "Private",
              availabilityZones: [vpc.availabilityZones[index]],
            }),
            securityGroup: proxySg,
            userData: userDataSettingPostfix,
          }
        );

        targetGroup.addTarget(
          new elbv2.InstanceTarget(ec2Instance.instanceId, 8080)
        );
      });

    // Client
    new ec2.Instance(this, `ClientEc2Instance`, {
      machineImage: ec2.MachineImage.latestWindows(
        ec2.WindowsVersion.WINDOWS_SERVER_2019_JAPANESE_FULL_BASE
      ),
      instanceType: new ec2.InstanceType("t3.micro"),
      vpc: vpc,
      vpcSubnets: vpc.selectSubnets({
        subnetGroupName: "Isolated",
      }),
      role: ssmIamRole,
      keyName: this.node.tryGetContext("key-pair"),
    });

    // Read CloudWatch parameters for Linux
    const cloudWatchParameter = fs.readFileSync(
      "./src/cloudWatch/AmazonCloudWatch-linux.json",
      "utf8"
    );

    // Create a new SSM Parameter for CloudWatch
    new ssm.StringParameter(this, "CloudWatchParameter", {
      description: "CloudWatch parameters for Linux",
      parameterName: "AmazonCloudWatch-linux",
      stringValue: cloudWatchParameter,
    });

    // Create EFS file system
    new efs.FileSystem(this, "EfsFileSystem", {
      vpc: vpc,
      enableAutomaticBackups: true,
      encrypted: true,
      lifecyclePolicy: efs.LifecyclePolicy.AFTER_14_DAYS,
      performanceMode: efs.PerformanceMode.GENERAL_PURPOSE,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      securityGroup: efsSg,
      vpcSubnets: vpc.selectSubnets({ subnetGroupName: "Isolated" }),
    });
  }
}

Squidのインストールと設定及び、CloudWatch Agent用のcollectdとDidges認証用のhttpd-toolsのインストールなどはUser Dataで行います。

実際のコードは以下の通りです。

./src/ec2/userDataSettingSquid.sh

# -x to display the command to be executed
set -x

# Redirect /var/log/user-data.log and /dev/console
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

# Install the necessary packages.
yum install -y squid httpd-tools
amazon-linux-extras install -y collectd

# Update
yum update -y

# Create a mount point for the EFS File system
mkdir /etc/squid/secrets

# Backup the squid configuration file.
cp -a /etc/squid/squid.conf /etc/squid/squid.conf.`date +"%Y%m%d"`

# Edit the squid configuration file.
sed -i -E 's/http_port 3128/http_port 0.0.0.0:8080/g' /etc/squid/squid.conf
sed -i -E '/^acl localnet src/d' /etc/squid/squid.conf
sed -i -E "/^# should be allowed$/a acl localnet src 10.0.0.0/24" /etc/squid/squid.conf

cat  <<"EOF" | sed -i -E '/# from where browsing should be allowed/r /dev/stdin' /etc/squid/squid.conf

# Require digest authentication.
auth_param digest program /usr/lib64/squid/digest_file_auth -c /etc/squid/secrets/.digestpasswd
auth_param digest children 20 startup=0 idle=1
auth_param digest realm Squid proxy-caching web server. It uses digest authentication.
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50
acl auth_users proxy_auth REQUIRED

EOF

sed -i -E "s/^http_access allow localnet/http_access allow localnet auth_users/g" /etc/squid/squid.conf

tee /etc/squid/squid.conf -a <<"EOF" >/dev/null

# Hiding client and proxy information
forwarded_for off
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

#  Don't display the version on the error page.
httpd_suppress_version_string on

# Anonymize hostnames
visible_hostname unknown

# Setting log format to Apache combined
logformat combined %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /var/log/squid/access.log combined
EOF


# Check the squid configuration file for incorrect descriptions.
squid -k parse

# Start squid.
systemctl start squid

# Check the status of squid.
systemctl status squid

# Enable squid auto-start.
systemctl enable squid

# Check the squid auto-start setting.
systemctl is-enabled squid

CloudWatch Agentの設定をして、/var/log/messagesだけでなく、Squidのアクセスログである/var/log/squid/access.logもCloudWatch Logsに出力させます。その前準備として、設定ファイルをSSMパラメーターストアにアップロードします。

実際のコードは以下の通りです。

./src/cloudWatch/AmazonCloudWatch-linux.json

{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [{
            "file_path": "/var/log/messages",
            "log_group_name": "/var/log/messages",
            "log_stream_name": "{instance_id}"
          },
          {
            "file_path": "/var/log/squid/access.log",
            "log_group_name": "/var/log/squid/access.log",
            "log_stream_name": "{instance_id}"
          }
        ]
      }
    }
  },
  "metrics": {
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "collectd": {
        "metrics_aggregation_interval": 60
      },
      "cpu": {
        "measurement": [
          "cpu_usage_idle",
          "cpu_usage_iowait",
          "cpu_usage_user",
          "cpu_usage_system"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
        ],
        "totalcpu": false
      },
      "disk": {
        "measurement": [
          "used_percent",
          "inodes_free"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
        ]
      },
      "diskio": {
        "measurement": [
          "io_time",
          "write_bytes",
          "read_bytes",
          "writes",
          "reads"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
        ]
      },
      "mem": {
        "measurement": [
          "mem_used_percent"
        ],
        "metrics_collection_interval": 60
      },
      "netstat": {
        "measurement": [
          "tcp_established",
          "tcp_time_wait"
        ],
        "metrics_collection_interval": 60
      },
      "statsd": {
        "metrics_aggregation_interval": 60,
        "metrics_collection_interval": 10,
        "service_address": ":8125"
      },
      "swap": {
        "measurement": [
          "swap_used_percent"
        ],
        "metrics_collection_interval": 60
      }
    }
  }
}

npx cdk deployで、AWS CDKでリソースをデプロイすると、以下のようなログが出力されます。

> npx cdk deploy
MFA token for arn:aws:iam::<AWSアカウントID>:mfa/<IAMユーザー名>: 980007
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

IAM Statement Changes
┌───┬───────────────────┬────────┬────────────────┬───────────────────────────────┬───────────┐
│   │ Resource          │ Effect │ Action         │ Principal                     │ Condition │
├───┼───────────────────┼────────┼────────────────┼───────────────────────────────┼───────────┤
│ + │ ${SsmIamRole.Arn} │ Allow  │ sts:AssumeRole │ Service:ec2.${AWS::URLSuffix} │           │
└───┴───────────────────┴────────┴────────────────┴───────────────────────────────┴───────────┘
IAM Policy Changes
┌───┬───────────────┬────────────────────────────────────────────────────────────────────┐
│   │ Resource      │ Managed Policy ARN                                                 │
├───┼───────────────┼────────────────────────────────────────────────────────────────────┤
│ + │ ${SsmIamRole} │ arn:${AWS::Partition}:iam::aws:policy/AmazonSSMManagedInstanceCore │
│ + │ ${SsmIamRole} │ arn:${AWS::Partition}:iam::aws:policy/CloudWatchAgentAdminPolicy   │
└───┴───────────────┴────────────────────────────────────────────────────────────────────┘
Security Group Changes
┌───┬────────────────────────────────────────────────────┬─────┬────────────┬──────────────────┐
│   │ Group                                              │ Dir │ Protocol   │ Peer             │
├───┼────────────────────────────────────────────────────┼─────┼────────────┼──────────────────┤
│ + │ ${ClientEc2Instance/InstanceSecurityGroup.GroupId} │ Out │ Everything │ Everyone (IPv4)  │
├───┼────────────────────────────────────────────────────┼─────┼────────────┼──────────────────┤
│ + │ ${Ec2MessagesVpcEndpoint/SecurityGroup.GroupId}    │ In  │ TCP 443    │ ${Vpc.CidrBlock} │
│ + │ ${Ec2MessagesVpcEndpoint/SecurityGroup.GroupId}    │ Out │ Everything │ Everyone (IPv4)  │
├───┼────────────────────────────────────────────────────┼─────┼────────────┼──────────────────┤
│ + │ ${EfsSg.GroupId}                                   │ In  │ TCP 2049   │ ${Vpc.CidrBlock} │
│ + │ ${EfsSg.GroupId}                                   │ Out │ Everything │ Everyone (IPv4)  │
├───┼────────────────────────────────────────────────────┼─────┼────────────┼──────────────────┤
│ + │ ${ProxySg.GroupId}                                 │ In  │ TCP 8080   │ ${Vpc.CidrBlock} │
│ + │ ${ProxySg.GroupId}                                 │ Out │ Everything │ Everyone (IPv4)  │
├───┼────────────────────────────────────────────────────┼─────┼────────────┼──────────────────┤
│ + │ ${SsmMessagesVpcEndpoint/SecurityGroup.GroupId}    │ In  │ TCP 443    │ ${Vpc.CidrBlock} │
│ + │ ${SsmMessagesVpcEndpoint/SecurityGroup.GroupId}    │ Out │ Everything │ Everyone (IPv4)  │
├───┼────────────────────────────────────────────────────┼─────┼────────────┼──────────────────┤
│ + │ ${SsmVpcEndpoint/SecurityGroup.GroupId}            │ In  │ TCP 443    │ ${Vpc.CidrBlock} │
│ + │ ${SsmVpcEndpoint/SecurityGroup.GroupId}            │ Out │ Everything │ Everyone (IPv4)  │
└───┴────────────────────────────────────────────────────┴─────┴────────────┴──────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Do you wish to deploy these changes (y/n)? y
ProxyAppStack: deploying...
ProxyAppStack: creating CloudFormation changeset...





 ✅  ProxyAppStack

Stack ARN:
arn:aws:cloudformation:us-east-1:<AWSアカウントID>:stack/ProxyAppStack/25ff0270-1cf4-11ec-9e8a-0e02679e83b9

npx cdk deploy実行完了後にマネージメントコンソールを確認すると、EC2インスタンスやNLB、ターゲットグループ、EFSファイルシステムが作成されていることが確認できます。

  • EC2インスタンス
    • EC2インスタンス一覧
  • NLB
    • NLB
  • ターゲットグループ
    • ターゲットグループ
  • EFSファイルシステム
    • EFSファイルシステム

ターゲットグループに登録されているEC2インスタンスのステータスがどちらもhealthyになっているので、Squidも正常に起動していそうですね。

念の為、User Dataに記載したシェルが正常に実行されているか確認するために、EC2インスタンス内の/var/log/user-data.logを確認します。

かなり長いので折くなったので、折りたたみますが、squid.serviceが起動(running)していることが確認できます。

/var/log/user-data.log

/var/log/user-data.log

+ yum install -y squid httpd-tools
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Existing lock /var/run/yum.pid: another copy is running as pid 2375.
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory :  82 M RSS (298 MB VSZ)
    Started: Mon Sep 27 04:31:57 2021 - 00:02 ago
    State  : Running, pid: 2375
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory : 152 M RSS (369 MB VSZ)
    Started: Mon Sep 27 04:31:57 2021 - 00:04 ago
    State  : Running, pid: 2375
Resolving Dependencies
--> Running transaction check
---> Package httpd-tools.x86_64 0:2.4.48-2.amzn2 will be installed
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-tools-2.4.48-2.amzn2.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-tools-2.4.48-2.amzn2.x86_64
---> Package squid.x86_64 7:3.5.20-17.amzn2.6.1 will be installed
--> Processing Dependency: squid-migration-script for package: 7:squid-3.5.20-17.amzn2.6.1.x86_64
--> Processing Dependency: perl(Digest::MD5) for package: 7:squid-3.5.20-17.amzn2.6.1.x86_64
--> Processing Dependency: perl(Data::Dumper) for package: 7:squid-3.5.20-17.amzn2.6.1.x86_64
--> Processing Dependency: perl(DBI) for package: 7:squid-3.5.20-17.amzn2.6.1.x86_64
--> Processing Dependency: libltdl.so.7()(64bit) for package: 7:squid-3.5.20-17.amzn2.6.1.x86_64
--> Processing Dependency: libecap.so.3()(64bit) for package: 7:squid-3.5.20-17.amzn2.6.1.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.6.3-5.amzn2.0.2 will be installed
---> Package apr-util.x86_64 0:1.6.1-5.amzn2.0.2 will be installed
--> Processing Dependency: apr-util-bdb(x86-64) = 1.6.1-5.amzn2.0.2 for package: apr-util-1.6.1-5.amzn2.0.2.x86_64
---> Package libecap.x86_64 0:1.0.0-1.amzn2.0.2 will be installed
---> Package libtool-ltdl.x86_64 0:2.4.2-22.2.amzn2.0.2 will be installed
---> Package perl-DBI.x86_64 0:1.627-4.amzn2.0.2 will be installed
--> Processing Dependency: perl(RPC::PlServer) >= 0.2001 for package: perl-DBI-1.627-4.amzn2.0.2.x86_64
--> Processing Dependency: perl(RPC::PlClient) >= 0.2000 for package: perl-DBI-1.627-4.amzn2.0.2.x86_64
---> Package perl-Data-Dumper.x86_64 0:2.145-3.amzn2.0.2 will be installed
---> Package perl-Digest-MD5.x86_64 0:2.52-3.amzn2.0.2 will be installed
--> Processing Dependency: perl(Digest::base) >= 1.00 for package: perl-Digest-MD5-2.52-3.amzn2.0.2.x86_64
---> Package squid-migration-script.x86_64 7:3.5.20-17.amzn2.6.1 will be installed
--> Running transaction check
---> Package apr-util-bdb.x86_64 0:1.6.1-5.amzn2.0.2 will be installed
---> Package perl-Digest.noarch 0:1.17-245.amzn2 will be installed
---> Package perl-PlRPC.noarch 0:0.2020-14.amzn2 will be installed
--> Processing Dependency: perl(Net::Daemon) >= 0.13 for package: perl-PlRPC-0.2020-14.amzn2.noarch
--> Processing Dependency: perl(Net::Daemon::Test) for package: perl-PlRPC-0.2020-14.amzn2.noarch
--> Processing Dependency: perl(Net::Daemon::Log) for package: perl-PlRPC-0.2020-14.amzn2.noarch
--> Processing Dependency: perl(Compress::Zlib) for package: perl-PlRPC-0.2020-14.amzn2.noarch
--> Running transaction check
---> Package perl-IO-Compress.noarch 0:2.061-2.amzn2 will be installed
--> Processing Dependency: perl(Compress::Raw::Zlib) >= 2.061 for package: perl-IO-Compress-2.061-2.amzn2.noarch
--> Processing Dependency: perl(Compress::Raw::Bzip2) >= 2.061 for package: perl-IO-Compress-2.061-2.amzn2.noarch
---> Package perl-Net-Daemon.noarch 0:0.48-5.amzn2 will be installed
--> Running transaction check
---> Package perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.amzn2.0.2 will be installed
---> Package perl-Compress-Raw-Zlib.x86_64 1:2.061-4.amzn2.0.2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                   Arch     Version                  Repository    Size
================================================================================
Installing:
 httpd-tools               x86_64   2.4.48-2.amzn2           amzn2-core    87 k
 squid                     x86_64   7:3.5.20-17.amzn2.6.1    amzn2-core   3.1 M
Installing for dependencies:
 apr                       x86_64   1.6.3-5.amzn2.0.2        amzn2-core   118 k
 apr-util                  x86_64   1.6.1-5.amzn2.0.2        amzn2-core    99 k
 apr-util-bdb              x86_64   1.6.1-5.amzn2.0.2        amzn2-core    19 k
 libecap                   x86_64   1.0.0-1.amzn2.0.2        amzn2-core    21 k
 libtool-ltdl              x86_64   2.4.2-22.2.amzn2.0.2     amzn2-core    49 k
 perl-Compress-Raw-Bzip2   x86_64   2.061-3.amzn2.0.2        amzn2-core    32 k
 perl-Compress-Raw-Zlib    x86_64   1:2.061-4.amzn2.0.2      amzn2-core    58 k
 perl-DBI                  x86_64   1.627-4.amzn2.0.2        amzn2-core   804 k
 perl-Data-Dumper          x86_64   2.145-3.amzn2.0.2        amzn2-core    48 k
 perl-Digest               noarch   1.17-245.amzn2           amzn2-core    23 k
 perl-Digest-MD5           x86_64   2.52-3.amzn2.0.2         amzn2-core    30 k
 perl-IO-Compress          noarch   2.061-2.amzn2            amzn2-core   260 k
 perl-Net-Daemon           noarch   0.48-5.amzn2             amzn2-core    51 k
 perl-PlRPC                noarch   0.2020-14.amzn2          amzn2-core    36 k
 squid-migration-script    x86_64   7:3.5.20-17.amzn2.6.1    amzn2-core    51 k

Transaction Summary
================================================================================
Install  2 Packages (+15 Dependent packages)

Total download size: 4.9 M
Installed size: 14 M
Downloading packages:
--------------------------------------------------------------------------------
Total                                               17 MB/s | 4.9 MB  00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : perl-Data-Dumper-2.145-3.amzn2.0.2.x86_64                   1/17 
  Installing : apr-1.6.3-5.amzn2.0.2.x86_64                                2/17 
  Installing : apr-util-bdb-1.6.1-5.amzn2.0.2.x86_64                       3/17 
  Installing : apr-util-1.6.1-5.amzn2.0.2.x86_64                           4/17 
  Installing : perl-Digest-1.17-245.amzn2.noarch                           5/17 
  Installing : perl-Digest-MD5-2.52-3.amzn2.0.2.x86_64                     6/17 
  Installing : 7:squid-migration-script-3.5.20-17.amzn2.6.1.x86_64         7/17 
  Installing : perl-Compress-Raw-Bzip2-2.061-3.amzn2.0.2.x86_64            8/17 
  Installing : libecap-1.0.0-1.amzn2.0.2.x86_64                            9/17 
  Installing : libtool-ltdl-2.4.2-22.2.amzn2.0.2.x86_64                   10/17 
  Installing : perl-Net-Daemon-0.48-5.amzn2.noarch                        11/17 
  Installing : 1:perl-Compress-Raw-Zlib-2.061-4.amzn2.0.2.x86_64          12/17 
  Installing : perl-IO-Compress-2.061-2.amzn2.noarch                      13/17 
  Installing : perl-PlRPC-0.2020-14.amzn2.noarch                          14/17 
  Installing : perl-DBI-1.627-4.amzn2.0.2.x86_64                          15/17 
  Installing : 7:squid-3.5.20-17.amzn2.6.1.x86_64                         16/17 
  Installing : httpd-tools-2.4.48-2.amzn2.x86_64                          17/17 
  Verifying  : apr-util-1.6.1-5.amzn2.0.2.x86_64                           1/17 
  Verifying  : 1:perl-Compress-Raw-Zlib-2.061-4.amzn2.0.2.x86_64           2/17 
  Verifying  : apr-util-bdb-1.6.1-5.amzn2.0.2.x86_64                       3/17 
  Verifying  : perl-Net-Daemon-0.48-5.amzn2.noarch                         4/17 
  Verifying  : perl-Digest-MD5-2.52-3.amzn2.0.2.x86_64                     5/17 
  Verifying  : 7:squid-3.5.20-17.amzn2.6.1.x86_64                          6/17 
  Verifying  : httpd-tools-2.4.48-2.amzn2.x86_64                           7/17 
  Verifying  : libtool-ltdl-2.4.2-22.2.amzn2.0.2.x86_64                    8/17 
  Verifying  : libecap-1.0.0-1.amzn2.0.2.x86_64                            9/17 
  Verifying  : perl-PlRPC-0.2020-14.amzn2.noarch                          10/17 
  Verifying  : apr-1.6.3-5.amzn2.0.2.x86_64                               11/17 
  Verifying  : perl-IO-Compress-2.061-2.amzn2.noarch                      12/17 
  Verifying  : perl-Compress-Raw-Bzip2-2.061-3.amzn2.0.2.x86_64           13/17 
  Verifying  : 7:squid-migration-script-3.5.20-17.amzn2.6.1.x86_64        14/17 
  Verifying  : perl-Digest-1.17-245.amzn2.noarch                          15/17 
  Verifying  : perl-DBI-1.627-4.amzn2.0.2.x86_64                          16/17 
  Verifying  : perl-Data-Dumper-2.145-3.amzn2.0.2.x86_64                  17/17 

Installed:
  httpd-tools.x86_64 0:2.4.48-2.amzn2     squid.x86_64 7:3.5.20-17.amzn2.6.1    

Dependency Installed:
  apr.x86_64 0:1.6.3-5.amzn2.0.2                                                
  apr-util.x86_64 0:1.6.1-5.amzn2.0.2                                           
  apr-util-bdb.x86_64 0:1.6.1-5.amzn2.0.2                                       
  libecap.x86_64 0:1.0.0-1.amzn2.0.2                                            
  libtool-ltdl.x86_64 0:2.4.2-22.2.amzn2.0.2                                    
  perl-Compress-Raw-Bzip2.x86_64 0:2.061-3.amzn2.0.2                            
  perl-Compress-Raw-Zlib.x86_64 1:2.061-4.amzn2.0.2                             
  perl-DBI.x86_64 0:1.627-4.amzn2.0.2                                           
  perl-Data-Dumper.x86_64 0:2.145-3.amzn2.0.2                                   
  perl-Digest.noarch 0:1.17-245.amzn2                                           
  perl-Digest-MD5.x86_64 0:2.52-3.amzn2.0.2                                     
  perl-IO-Compress.noarch 0:2.061-2.amzn2                                       
  perl-Net-Daemon.noarch 0:0.48-5.amzn2                                         
  perl-PlRPC.noarch 0:0.2020-14.amzn2                                           
  squid-migration-script.x86_64 7:3.5.20-17.amzn2.6.1                           

Complete!
+ amazon-linux-extras install -y collectd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Existing lock /var/run/yum.pid: another copy is running as pid 2474.
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory :  71 M RSS (363 MB VSZ)
    Started: Mon Sep 27 04:32:06 2021 - 00:02 ago
    State  : Sleeping, pid: 2474
Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: yum
    Memory : 153 M RSS (445 MB VSZ)
    Started: Mon Sep 27 04:32:06 2021 - 00:04 ago
    State  : Running, pid: 2474
Cleaning repos: amzn2-core amzn2extra-collectd amzn2extra-docker
17 metadata files removed
6 sqlite files removed
0 metadata files removed
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package collectd.x86_64 0:5.8.1-1.amzn2.0.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package      Arch       Version                  Repository               Size
================================================================================
Installing:
 collectd     x86_64     5.8.1-1.amzn2.0.1        amzn2extra-collectd     706 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 706 k
Installed size: 2.0 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : collectd-5.8.1-1.amzn2.0.1.x86_64                            1/1 
  Verifying  : collectd-5.8.1-1.amzn2.0.1.x86_64                            1/1 

Installed:
  collectd.x86_64 0:5.8.1-1.amzn2.0.1                                           

Complete!
Installing collectd
  0  ansible2                 available    \
        [ =2.4.2  =2.4.6  =2.8  =stable ]
  2  httpd_modules            available    [ =1.0  =stable ]
  3  memcached1.5             available    \
        [ =1.5.1  =1.5.16  =1.5.17 ]
  5  postgresql9.6            available    \
        [ =9.6.6  =9.6.8  =stable ]
  6  postgresql10             available    [ =10  =stable ]
  9  R3.4                     available    [ =3.4.3  =stable ]
 10  rust1                    available    \
        [ =1.22.1  =1.26.0  =1.26.1  =1.27.2  =1.31.0  =1.38.0
          =stable ]
 11  vim                      available    [ =8.0  =stable ]
 15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
          =7.2.24  =7.2.26  =stable ]
 17  lamp-mariadb10.2-php7.2  available    \
        [ =10.2.10_7.2.0  =10.2.10_7.2.4  =10.2.10_7.2.5
          =10.2.10_7.2.8  =10.2.10_7.2.11  =10.2.10_7.2.13
          =10.2.10_7.2.14  =10.2.10_7.2.16  =10.2.10_7.2.17
          =10.2.10_7.2.19  =10.2.10_7.2.22  =10.2.10_7.2.23
          =10.2.10_7.2.24  =stable ]
 18  libreoffice              available    \
        [ =5.0.6.2_15  =5.3.6.1  =stable ]
 19  gimp                     available    [ =2.8.22 ]
 20  docker=latest            enabled      \
        [ =17.12.1  =18.03.1  =18.06.1  =18.09.9  =stable ]
 21  mate-desktop1.x          available    \
        [ =1.19.0  =1.20.0  =stable ]
 22  GraphicsMagick1.3        available    \
        [ =1.3.29  =1.3.32  =1.3.34  =stable ]
 23  tomcat8.5                available    \
        [ =8.5.31  =8.5.32  =8.5.38  =8.5.40  =8.5.42  =8.5.50
          =stable ]
 24  epel                     available    [ =7.11  =stable ]
 25  testing                  available    [ =1.0  =stable ]
 26  ecs                      available    [ =stable ]
 27  corretto8                available    \
        [ =1.8.0_192  =1.8.0_202  =1.8.0_212  =1.8.0_222  =1.8.0_232
          =1.8.0_242  =stable ]
 28  firecracker              available    [ =0.11  =stable ]
 29  golang1.11               available    \
        [ =1.11.3  =1.11.11  =1.11.13  =stable ]
 30  squid4                   available    [ =4  =stable ]
 31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
          =7.3.11  =7.3.13  =stable ]
 32  lustre2.10               available    \
        [ =2.10.5  =2.10.8  =stable ]
 33  java-openjdk11           available    [ =11  =stable ]
 34  lynis                    available    [ =stable ]
 35  kernel-ng                available    [ =stable ]
 36  BCC                      available    [ =0.x  =stable ]
 37  mono                     available    [ =5.x  =stable ]
 38  nginx1                   available    [ =stable ]
 39  ruby2.6                  available    [ =2.6  =stable ]
 40  mock                     available    [ =stable ]
 41  postgresql11             available    [ =11  =stable ]
 42  php7.4                   available    [ =stable ]
 43  livepatch                available    [ =stable ]
 44  python3.8                available    [ =stable ]
 45  haproxy2                 available    [ =stable ]
 46  collectd=latest          enabled      [ =stable ]
 47  aws-nitro-enclaves-cli   available    [ =stable ]
 48  R4                       available    [ =stable ]
 49  kernel-5.4               available    [ =stable ]
 50  selinux-ng               available    [ =stable ]
 51  php8.0                   available    [ =stable ]
 52  tomcat9                  available    [ =stable ]
 53  unbound1.13              available    [ =stable ]
 54  mariadb10.5              available    [ =stable ]
 55  kernel-5.10              available    [ =stable ]
 56  redis6                   available    [ =stable ]
 57  ruby3.0                  available    [ =stable ]
 58  postgresql12             available    [ =stable ]
 59  postgresql13             available    [ =stable ]
 60  mock2                    available    [ =stable ]
 61  dnsmasq2.85              available    [ =stable ]
+ yum update -y
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package curl.x86_64 0:7.76.1-4.amzn2.0.1 will be updated
---> Package curl.x86_64 0:7.76.1-7.amzn2.0.2 will be an update
---> Package device-mapper.x86_64 7:1.02.146-4.amzn2.0.2 will be updated
---> Package device-mapper.x86_64 7:1.02.170-6.amzn2.5 will be an update
---> Package device-mapper-event.x86_64 7:1.02.146-4.amzn2.0.2 will be updated
---> Package device-mapper-event.x86_64 7:1.02.170-6.amzn2.5 will be an update
---> Package device-mapper-event-libs.x86_64 7:1.02.146-4.amzn2.0.2 will be updated
---> Package device-mapper-event-libs.x86_64 7:1.02.170-6.amzn2.5 will be an update
---> Package device-mapper-libs.x86_64 7:1.02.146-4.amzn2.0.2 will be updated
---> Package device-mapper-libs.x86_64 7:1.02.170-6.amzn2.5 will be an update
---> Package glibc.x86_64 0:2.26-48.amzn2 will be updated
---> Package glibc.x86_64 0:2.26-54.amzn2 will be an update
---> Package glibc-all-langpacks.x86_64 0:2.26-48.amzn2 will be updated
---> Package glibc-all-langpacks.x86_64 0:2.26-54.amzn2 will be an update
---> Package glibc-common.x86_64 0:2.26-48.amzn2 will be updated
---> Package glibc-common.x86_64 0:2.26-54.amzn2 will be an update
---> Package glibc-locale-source.x86_64 0:2.26-48.amzn2 will be updated
---> Package glibc-locale-source.x86_64 0:2.26-54.amzn2 will be an update
---> Package glibc-minimal-langpack.x86_64 0:2.26-48.amzn2 will be updated
---> Package glibc-minimal-langpack.x86_64 0:2.26-54.amzn2 will be an update
---> Package grub2.x86_64 1:2.06-2.amzn2.0.3 will be obsoleted
---> Package grub2.x86_64 1:2.06-2.amzn2.0.6 will be obsoleting
---> Package grub2-common.noarch 1:2.06-2.amzn2.0.3 will be updated
---> Package grub2-common.noarch 1:2.06-2.amzn2.0.6 will be an update
---> Package grub2-efi-x64-ec2.x86_64 1:2.06-2.amzn2.0.3 will be updated
---> Package grub2-efi-x64-ec2.x86_64 1:2.06-2.amzn2.0.6 will be an update
---> Package grub2-pc.x86_64 1:2.06-2.amzn2.0.3 will be updated
---> Package grub2-pc.x86_64 1:2.06-2.amzn2.0.6 will be obsoleting
---> Package grub2-pc-modules.noarch 1:2.06-2.amzn2.0.3 will be updated
---> Package grub2-pc-modules.noarch 1:2.06-2.amzn2.0.6 will be an update
---> Package grub2-tools.x86_64 1:2.06-2.amzn2.0.3 will be obsoleted
---> Package grub2-tools.x86_64 1:2.06-2.amzn2.0.6 will be obsoleting
---> Package grub2-tools-efi.x86_64 1:2.06-2.amzn2.0.6 will be obsoleting
---> Package grub2-tools-extra.x86_64 1:2.06-2.amzn2.0.6 will be obsoleting
---> Package grub2-tools-minimal.x86_64 1:2.06-2.amzn2.0.3 will be updated
---> Package grub2-tools-minimal.x86_64 1:2.06-2.amzn2.0.6 will be obsoleting
---> Package kernel.x86_64 0:4.14.246-187.474.amzn2 will be installed
---> Package kernel-tools.x86_64 0:4.14.243-185.433.amzn2 will be updated
---> Package kernel-tools.x86_64 0:4.14.246-187.474.amzn2 will be an update
---> Package libblkid.x86_64 0:2.30.2-2.amzn2.0.4 will be updated
---> Package libblkid.x86_64 0:2.30.2-2.amzn2.0.5 will be an update
---> Package libcrypt.x86_64 0:2.26-48.amzn2 will be updated
---> Package libcrypt.x86_64 0:2.26-54.amzn2 will be an update
---> Package libcurl.x86_64 0:7.76.1-4.amzn2.0.1 will be updated
---> Package libcurl.x86_64 0:7.76.1-7.amzn2.0.2 will be an update
---> Package libfdisk.x86_64 0:2.30.2-2.amzn2.0.4 will be updated
---> Package libfdisk.x86_64 0:2.30.2-2.amzn2.0.5 will be an update
---> Package libmount.x86_64 0:2.30.2-2.amzn2.0.4 will be updated
---> Package libmount.x86_64 0:2.30.2-2.amzn2.0.5 will be an update
---> Package libsmartcols.x86_64 0:2.30.2-2.amzn2.0.4 will be updated
---> Package libsmartcols.x86_64 0:2.30.2-2.amzn2.0.5 will be an update
---> Package libuuid.x86_64 0:2.30.2-2.amzn2.0.4 will be updated
---> Package libuuid.x86_64 0:2.30.2-2.amzn2.0.5 will be an update
---> Package lvm2.x86_64 7:2.02.177-4.amzn2.0.2 will be updated
---> Package lvm2.x86_64 7:2.02.187-6.amzn2.5 will be an update
---> Package lvm2-libs.x86_64 7:2.02.177-4.amzn2.0.2 will be updated
---> Package lvm2-libs.x86_64 7:2.02.187-6.amzn2.5 will be an update
---> Package openldap.x86_64 0:2.4.44-23.amzn2.0.1 will be updated
---> Package openldap.x86_64 0:2.4.44-23.amzn2.0.2 will be an update
---> Package systemd.x86_64 0:219-78.amzn2.0.14 will be updated
---> Package systemd.x86_64 0:219-78.amzn2.0.15 will be an update
---> Package systemd-libs.x86_64 0:219-78.amzn2.0.14 will be updated
---> Package systemd-libs.x86_64 0:219-78.amzn2.0.15 will be an update
---> Package systemd-sysv.x86_64 0:219-78.amzn2.0.14 will be updated
---> Package systemd-sysv.x86_64 0:219-78.amzn2.0.15 will be an update
---> Package util-linux.x86_64 0:2.30.2-2.amzn2.0.4 will be updated
---> Package util-linux.x86_64 0:2.30.2-2.amzn2.0.5 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                   Arch    Version                    Repository   Size
================================================================================
Installing:
 grub2                     x86_64  1:2.06-2.amzn2.0.6         amzn2-core   45 k
     replacing  grub2.x86_64 1:2.06-2.amzn2.0.3
 grub2-pc                  x86_64  1:2.06-2.amzn2.0.6         amzn2-core   44 k
     replacing  grub2.x86_64 1:2.06-2.amzn2.0.3
 grub2-tools               x86_64  1:2.06-2.amzn2.0.6         amzn2-core  2.0 M
     replacing  grub2-tools.x86_64 1:2.06-2.amzn2.0.3
 grub2-tools-efi           x86_64  1:2.06-2.amzn2.0.6         amzn2-core  560 k
     replacing  grub2-tools.x86_64 1:2.06-2.amzn2.0.3
 grub2-tools-extra         x86_64  1:2.06-2.amzn2.0.6         amzn2-core  1.0 M
     replacing  grub2-tools.x86_64 1:2.06-2.amzn2.0.3
 grub2-tools-minimal       x86_64  1:2.06-2.amzn2.0.6         amzn2-core  623 k
     replacing  grub2-tools.x86_64 1:2.06-2.amzn2.0.3
 kernel                    x86_64  4.14.246-187.474.amzn2     amzn2-core   21 M
Updating:
 curl                      x86_64  7.76.1-7.amzn2.0.2         amzn2-core  345 k
 device-mapper             x86_64  7:1.02.170-6.amzn2.5       amzn2-core  297 k
 device-mapper-event       x86_64  7:1.02.170-6.amzn2.5       amzn2-core  192 k
 device-mapper-event-libs  x86_64  7:1.02.170-6.amzn2.5       amzn2-core  192 k
 device-mapper-libs        x86_64  7:1.02.170-6.amzn2.5       amzn2-core  326 k
 glibc                     x86_64  2.26-54.amzn2              amzn2-core  3.3 M
 glibc-all-langpacks       x86_64  2.26-54.amzn2              amzn2-core  7.0 M
 glibc-common              x86_64  2.26-54.amzn2              amzn2-core  772 k
 glibc-locale-source       x86_64  2.26-54.amzn2              amzn2-core  3.2 M
 glibc-minimal-langpack    x86_64  2.26-54.amzn2              amzn2-core   31 k
 grub2-common              noarch  1:2.06-2.amzn2.0.6         amzn2-core  1.7 M
 grub2-efi-x64-ec2         x86_64  1:2.06-2.amzn2.0.6         amzn2-core  281 k
 grub2-pc-modules          noarch  1:2.06-2.amzn2.0.6         amzn2-core  938 k
 kernel-tools              x86_64  4.14.246-187.474.amzn2     amzn2-core  152 k
 libblkid                  x86_64  2.30.2-2.amzn2.0.5         amzn2-core  190 k
 libcrypt                  x86_64  2.26-54.amzn2              amzn2-core   51 k
 libcurl                   x86_64  7.76.1-7.amzn2.0.2         amzn2-core  314 k
 libfdisk                  x86_64  2.30.2-2.amzn2.0.5         amzn2-core  237 k
 libmount                  x86_64  2.30.2-2.amzn2.0.5         amzn2-core  212 k
 libsmartcols              x86_64  2.30.2-2.amzn2.0.5         amzn2-core  155 k
 libuuid                   x86_64  2.30.2-2.amzn2.0.5         amzn2-core   79 k
 lvm2                      x86_64  7:2.02.187-6.amzn2.5       amzn2-core  1.3 M
 lvm2-libs                 x86_64  7:2.02.187-6.amzn2.5       amzn2-core  1.1 M
 openldap                  x86_64  2.4.44-23.amzn2.0.2        amzn2-core  350 k
 systemd                   x86_64  219-78.amzn2.0.15          amzn2-core  5.0 M
 systemd-libs              x86_64  219-78.amzn2.0.15          amzn2-core  408 k
 systemd-sysv              x86_64  219-78.amzn2.0.15          amzn2-core   97 k
 util-linux                x86_64  2.30.2-2.amzn2.0.5         amzn2-core  2.3 M

Transaction Summary
================================================================================
Install   7 Packages
Upgrade  28 Packages

Total download size: 56 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
--------------------------------------------------------------------------------
Total                                               65 MB/s |  56 MB  00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : 1:grub2-common-2.06-2.amzn2.0.6.noarch                      1/67 
  Updating   : glibc-minimal-langpack-2.26-54.amzn2.x86_64                 2/67 
  Updating   : glibc-2.26-54.amzn2.x86_64                                  3/67 
  Updating   : glibc-common-2.26-54.amzn2.x86_64                           4/67 
  Updating   : systemd-libs-219-78.amzn2.0.15.x86_64                       5/67 
  Updating   : libuuid-2.30.2-2.amzn2.0.5.x86_64                           6/67 
  Updating   : libblkid-2.30.2-2.amzn2.0.5.x86_64                          7/67 
  Updating   : libmount-2.30.2-2.amzn2.0.5.x86_64                          8/67 
  Updating   : libcrypt-2.26-54.amzn2.x86_64                               9/67 
  Updating   : openldap-2.4.44-23.amzn2.0.2.x86_64                        10/67 
  Updating   : libcurl-7.76.1-7.amzn2.0.2.x86_64                          11/67 
  Updating   : systemd-219-78.amzn2.0.15.x86_64                           12/67 
  Updating   : libfdisk-2.30.2-2.amzn2.0.5.x86_64                         13/67 
  Updating   : libsmartcols-2.30.2-2.amzn2.0.5.x86_64                     14/67 
  Updating   : util-linux-2.30.2-2.amzn2.0.5.x86_64                       15/67 
  Updating   : 7:device-mapper-libs-1.02.170-6.amzn2.5.x86_64             16/67 
  Updating   : 7:device-mapper-1.02.170-6.amzn2.5.x86_64                  17/67 
  Updating   : 7:device-mapper-event-libs-1.02.170-6.amzn2.5.x86_64       18/67 
  Installing : 1:grub2-tools-minimal-2.06-2.amzn2.0.6.x86_64              19/67 
  Installing : 1:grub2-tools-2.06-2.amzn2.0.6.x86_64                      20/67 
  Updating   : 7:device-mapper-event-1.02.170-6.amzn2.5.x86_64            21/67 
  Updating   : 7:lvm2-libs-2.02.187-6.amzn2.5.x86_64                      22/67 
  Updating   : 1:grub2-pc-modules-2.06-2.amzn2.0.6.noarch                 23/67 
  Installing : 1:grub2-pc-2.06-2.amzn2.0.6.x86_64                         24/67 
  Installing : 1:grub2-2.06-2.amzn2.0.6.x86_64                            25/67 
  Updating   : 7:lvm2-2.02.187-6.amzn2.5.x86_64                           26/67 
  Updating   : 1:grub2-efi-x64-ec2-2.06-2.amzn2.0.6.x86_64                27/67 
  Installing : 1:grub2-tools-extra-2.06-2.amzn2.0.6.x86_64                28/67 
  Installing : 1:grub2-tools-efi-2.06-2.amzn2.0.6.x86_64                  29/67 
  Updating   : systemd-sysv-219-78.amzn2.0.15.x86_64                      30/67 
  Updating   : curl-7.76.1-7.amzn2.0.2.x86_64                             31/67 
  Updating   : glibc-locale-source-2.26-54.amzn2.x86_64                   32/67 
  Updating   : glibc-all-langpacks-2.26-54.amzn2.x86_64                   33/67 
  Updating   : kernel-tools-4.14.246-187.474.amzn2.x86_64                 34/67 
  Installing : kernel-4.14.246-187.474.amzn2.x86_64                       35/67 
  Cleanup    : 1:grub2-efi-x64-ec2-2.06-2.amzn2.0.3.x86_64                36/67 
  Cleanup    : glibc-all-langpacks-2.26-48.amzn2.x86_64                   37/67 
  Cleanup    : glibc-locale-source-2.26-48.amzn2.x86_64                   38/67 
  Cleanup    : 1:grub2-2.06-2.amzn2.0.3.x86_64                            39/67 
  Cleanup    : 1:grub2-pc-2.06-2.amzn2.0.3.x86_64                         40/67 
  Cleanup    : 1:grub2-pc-modules-2.06-2.amzn2.0.3.noarch                 41/67 
  Cleanup    : systemd-sysv-219-78.amzn2.0.14.x86_64                      42/67 
  Cleanup    : 7:lvm2-2.02.177-4.amzn2.0.2.x86_64                         43/67 
  Cleanup    : 7:lvm2-libs-2.02.177-4.amzn2.0.2.x86_64                    44/67 
  Cleanup    : 7:device-mapper-event-1.02.146-4.amzn2.0.2.x86_64          45/67 
  Cleanup    : 1:grub2-tools-minimal-2.06-2.amzn2.0.3.x86_64              46/67 
  Cleanup    : 1:grub2-tools-2.06-2.amzn2.0.3.x86_64                      47/67 
  Cleanup    : curl-7.76.1-4.amzn2.0.1.x86_64                             48/67 
  Cleanup    : 7:device-mapper-event-libs-1.02.146-4.amzn2.0.2.x86_64     49/67 
  Cleanup    : 7:device-mapper-1.02.146-4.amzn2.0.2.x86_64                50/67 
  Cleanup    : 7:device-mapper-libs-1.02.146-4.amzn2.0.2.x86_64           51/67 
  Cleanup    : util-linux-2.30.2-2.amzn2.0.4.x86_64                       52/67 
  Cleanup    : systemd-219-78.amzn2.0.14.x86_64                           53/67 
  Cleanup    : libmount-2.30.2-2.amzn2.0.4.x86_64                         54/67 
  Cleanup    : libfdisk-2.30.2-2.amzn2.0.4.x86_64                         55/67 
  Cleanup    : libblkid-2.30.2-2.amzn2.0.4.x86_64                         56/67 
  Cleanup    : libcurl-7.76.1-4.amzn2.0.1.x86_64                          57/67 
  Cleanup    : openldap-2.4.44-23.amzn2.0.1.x86_64                        58/67 
  Cleanup    : libuuid-2.30.2-2.amzn2.0.4.x86_64                          59/67 
  Cleanup    : libcrypt-2.26-48.amzn2.x86_64                              60/67 
  Cleanup    : systemd-libs-219-78.amzn2.0.14.x86_64                      61/67 
  Cleanup    : libsmartcols-2.30.2-2.amzn2.0.4.x86_64                     62/67 
  Cleanup    : kernel-tools-4.14.243-185.433.amzn2.x86_64                 63/67 
  Cleanup    : 1:grub2-common-2.06-2.amzn2.0.3.noarch                     64/67 
  Cleanup    : glibc-minimal-langpack-2.26-48.amzn2.x86_64                65/67 
  Cleanup    : glibc-2.26-48.amzn2.x86_64                                 66/67 
  Cleanup    : glibc-common-2.26-48.amzn2.x86_64                          67/67 
  Verifying  : glibc-common-2.26-54.amzn2.x86_64                           1/67 
  Verifying  : systemd-sysv-219-78.amzn2.0.15.x86_64                       2/67 
  Verifying  : libcrypt-2.26-54.amzn2.x86_64                               3/67 
  Verifying  : 7:device-mapper-event-libs-1.02.170-6.amzn2.5.x86_64        4/67 
  Verifying  : 1:grub2-tools-efi-2.06-2.amzn2.0.6.x86_64                   5/67 
  Verifying  : libmount-2.30.2-2.amzn2.0.5.x86_64                          6/67 
  Verifying  : systemd-219-78.amzn2.0.15.x86_64                            7/67 
  Verifying  : 1:grub2-common-2.06-2.amzn2.0.6.noarch                      8/67 
  Verifying  : systemd-libs-219-78.amzn2.0.15.x86_64                       9/67 
  Verifying  : 7:lvm2-2.02.187-6.amzn2.5.x86_64                           10/67 
  Verifying  : glibc-minimal-langpack-2.26-54.amzn2.x86_64                11/67 
  Verifying  : 1:grub2-2.06-2.amzn2.0.6.x86_64                            12/67 
  Verifying  : glibc-locale-source-2.26-54.amzn2.x86_64                   13/67 
  Verifying  : openldap-2.4.44-23.amzn2.0.2.x86_64                        14/67 
  Verifying  : 7:device-mapper-libs-1.02.170-6.amzn2.5.x86_64             15/67 
  Verifying  : 1:grub2-tools-extra-2.06-2.amzn2.0.6.x86_64                16/67 
  Verifying  : 1:grub2-tools-minimal-2.06-2.amzn2.0.6.x86_64              17/67 
  Verifying  : kernel-tools-4.14.246-187.474.amzn2.x86_64                 18/67 
  Verifying  : libcurl-7.76.1-7.amzn2.0.2.x86_64                          19/67 
  Verifying  : kernel-4.14.246-187.474.amzn2.x86_64                       20/67 
  Verifying  : 1:grub2-tools-2.06-2.amzn2.0.6.x86_64                      21/67 
  Verifying  : 1:grub2-efi-x64-ec2-2.06-2.amzn2.0.6.x86_64                22/67 
  Verifying  : 7:device-mapper-1.02.170-6.amzn2.5.x86_64                  23/67 
  Verifying  : util-linux-2.30.2-2.amzn2.0.5.x86_64                       24/67 
  Verifying  : curl-7.76.1-7.amzn2.0.2.x86_64                             25/67 
  Verifying  : 7:device-mapper-event-1.02.170-6.amzn2.5.x86_64            26/67 
  Verifying  : 7:lvm2-libs-2.02.187-6.amzn2.5.x86_64                      27/67 
  Verifying  : glibc-all-langpacks-2.26-54.amzn2.x86_64                   28/67 
  Verifying  : libfdisk-2.30.2-2.amzn2.0.5.x86_64                         29/67 
  Verifying  : libblkid-2.30.2-2.amzn2.0.5.x86_64                         30/67 
  Verifying  : 1:grub2-pc-modules-2.06-2.amzn2.0.6.noarch                 31/67 
  Verifying  : 1:grub2-pc-2.06-2.amzn2.0.6.x86_64                         32/67 
  Verifying  : libuuid-2.30.2-2.amzn2.0.5.x86_64                          33/67 
  Verifying  : libsmartcols-2.30.2-2.amzn2.0.5.x86_64                     34/67 
  Verifying  : glibc-2.26-54.amzn2.x86_64                                 35/67 
  Verifying  : glibc-common-2.26-48.amzn2.x86_64                          36/67 
  Verifying  : 1:grub2-pc-modules-2.06-2.amzn2.0.3.noarch                 37/67 
  Verifying  : 7:device-mapper-libs-1.02.146-4.amzn2.0.2.x86_64           38/67 
  Verifying  : curl-7.76.1-4.amzn2.0.1.x86_64                             39/67 
  Verifying  : openldap-2.4.44-23.amzn2.0.1.x86_64                        40/67 
  Verifying  : glibc-all-langpacks-2.26-48.amzn2.x86_64                   41/67 
  Verifying  : glibc-locale-source-2.26-48.amzn2.x86_64                   42/67 
  Verifying  : libfdisk-2.30.2-2.amzn2.0.4.x86_64                         43/67 
  Verifying  : libcrypt-2.26-48.amzn2.x86_64                              44/67 
  Verifying  : 1:grub2-tools-minimal-2.06-2.amzn2.0.3.x86_64              45/67 
  Verifying  : libblkid-2.30.2-2.amzn2.0.4.x86_64                         46/67 
  Verifying  : 1:grub2-common-2.06-2.amzn2.0.3.noarch                     47/67 
  Verifying  : glibc-2.26-48.amzn2.x86_64                                 48/67 
  Verifying  : 1:grub2-efi-x64-ec2-2.06-2.amzn2.0.3.x86_64                49/67 
  Verifying  : libsmartcols-2.30.2-2.amzn2.0.4.x86_64                     50/67 
  Verifying  : 1:grub2-tools-2.06-2.amzn2.0.3.x86_64                      51/67 
  Verifying  : libcurl-7.76.1-4.amzn2.0.1.x86_64                          52/67 
  Verifying  : systemd-sysv-219-78.amzn2.0.14.x86_64                      53/67 
  Verifying  : glibc-minimal-langpack-2.26-48.amzn2.x86_64                54/67 
  Verifying  : util-linux-2.30.2-2.amzn2.0.4.x86_64                       55/67 
  Verifying  : 1:grub2-2.06-2.amzn2.0.3.x86_64                            56/67 
  Verifying  : 1:grub2-pc-2.06-2.amzn2.0.3.x86_64                         57/67 
  Verifying  : 7:lvm2-2.02.177-4.amzn2.0.2.x86_64                         58/67 
  Verifying  : systemd-219-78.amzn2.0.14.x86_64                           59/67 
  Verifying  : systemd-libs-219-78.amzn2.0.14.x86_64                      60/67 
  Verifying  : 7:device-mapper-1.02.146-4.amzn2.0.2.x86_64                61/67 
  Verifying  : 7:lvm2-libs-2.02.177-4.amzn2.0.2.x86_64                    62/67 
  Verifying  : libmount-2.30.2-2.amzn2.0.4.x86_64                         63/67 
  Verifying  : libuuid-2.30.2-2.amzn2.0.4.x86_64                          64/67 
  Verifying  : kernel-tools-4.14.243-185.433.amzn2.x86_64                 65/67 
  Verifying  : 7:device-mapper-event-libs-1.02.146-4.amzn2.0.2.x86_64     66/67 
  Verifying  : 7:device-mapper-event-1.02.146-4.amzn2.0.2.x86_64          67/67 

Installed:
  grub2.x86_64 1:2.06-2.amzn2.0.6                                               
  grub2-pc.x86_64 1:2.06-2.amzn2.0.6                                            
  grub2-tools.x86_64 1:2.06-2.amzn2.0.6                                         
  grub2-tools-efi.x86_64 1:2.06-2.amzn2.0.6                                     
  grub2-tools-extra.x86_64 1:2.06-2.amzn2.0.6                                   
  grub2-tools-minimal.x86_64 1:2.06-2.amzn2.0.6                                 
  kernel.x86_64 0:4.14.246-187.474.amzn2                                        

Updated:
  curl.x86_64 0:7.76.1-7.amzn2.0.2                                              
  device-mapper.x86_64 7:1.02.170-6.amzn2.5                                     
  device-mapper-event.x86_64 7:1.02.170-6.amzn2.5                               
  device-mapper-event-libs.x86_64 7:1.02.170-6.amzn2.5                          
  device-mapper-libs.x86_64 7:1.02.170-6.amzn2.5                                
  glibc.x86_64 0:2.26-54.amzn2                                                  
  glibc-all-langpacks.x86_64 0:2.26-54.amzn2                                    
  glibc-common.x86_64 0:2.26-54.amzn2                                           
  glibc-locale-source.x86_64 0:2.26-54.amzn2                                    
  glibc-minimal-langpack.x86_64 0:2.26-54.amzn2                                 
  grub2-common.noarch 1:2.06-2.amzn2.0.6                                        
  grub2-efi-x64-ec2.x86_64 1:2.06-2.amzn2.0.6                                   
  grub2-pc-modules.noarch 1:2.06-2.amzn2.0.6                                    
  kernel-tools.x86_64 0:4.14.246-187.474.amzn2                                  
  libblkid.x86_64 0:2.30.2-2.amzn2.0.5                                          
  libcrypt.x86_64 0:2.26-54.amzn2                                               
  libcurl.x86_64 0:7.76.1-7.amzn2.0.2                                           
  libfdisk.x86_64 0:2.30.2-2.amzn2.0.5                                          
  libmount.x86_64 0:2.30.2-2.amzn2.0.5                                          
  libsmartcols.x86_64 0:2.30.2-2.amzn2.0.5                                      
  libuuid.x86_64 0:2.30.2-2.amzn2.0.5                                           
  lvm2.x86_64 7:2.02.187-6.amzn2.5                                              
  lvm2-libs.x86_64 7:2.02.187-6.amzn2.5                                         
  openldap.x86_64 0:2.4.44-23.amzn2.0.2                                         
  systemd.x86_64 0:219-78.amzn2.0.15                                            
  systemd-libs.x86_64 0:219-78.amzn2.0.15                                       
  systemd-sysv.x86_64 0:219-78.amzn2.0.15                                       
  util-linux.x86_64 0:2.30.2-2.amzn2.0.5                                        

Replaced:
  grub2.x86_64 1:2.06-2.amzn2.0.3     grub2-tools.x86_64 1:2.06-2.amzn2.0.3    

Complete!
+ mkdir /etc/squid/secrets
++ date +%Y%m%d
+ cp -a /etc/squid/squid.conf /etc/squid/squid.conf.20210927
+ sed -i -E 's/http_port 3128/http_port 0.0.0.0:8080/g' /etc/squid/squid.conf
+ sed -i -E '/^acl localnet src/d' /etc/squid/squid.conf
+ sed -i -E '/^# should be allowed$/a acl localnet src 10.0.0.0/24' /etc/squid/squid.conf
+ cat
+ sed -i -E '/# from where browsing should be allowed/r /dev/stdin' /etc/squid/squid.conf
+ sed -i -E 's/^http_access allow localnet/http_access allow localnet auth_users/g' /etc/squid/squid.conf
+ tee /etc/squid/squid.conf -a
+ squid -k parse
2021/09/27 04:32:41| Startup: Initializing Authentication Schemes ...
2021/09/27 04:32:41| Startup: Initialized Authentication Scheme 'basic'
2021/09/27 04:32:41| Startup: Initialized Authentication Scheme 'digest'
2021/09/27 04:32:41| Startup: Initialized Authentication Scheme 'negotiate'
2021/09/27 04:32:41| Startup: Initialized Authentication Scheme 'ntlm'
2021/09/27 04:32:41| Startup: Initialized Authentication.
2021/09/27 04:32:41| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2021/09/27 04:32:41| Processing: acl localnet src 10.0.0.0/24
2021/09/27 04:32:41| Processing: acl SSL_ports port 443
2021/09/27 04:32:41| Processing: acl Safe_ports port 80         # http
2021/09/27 04:32:41| Processing: acl Safe_ports port 21         # ftp
2021/09/27 04:32:41| Processing: acl Safe_ports port 443                # https
2021/09/27 04:32:41| Processing: acl Safe_ports port 70         # gopher
2021/09/27 04:32:41| Processing: acl Safe_ports port 210                # wais
2021/09/27 04:32:41| Processing: acl Safe_ports port 1025-65535 # unregistered ports
2021/09/27 04:32:41| Processing: acl Safe_ports port 280                # http-mgmt
2021/09/27 04:32:41| Processing: acl Safe_ports port 488                # gss-http
2021/09/27 04:32:41| Processing: acl Safe_ports port 591                # filemaker
2021/09/27 04:32:41| Processing: acl Safe_ports port 777                # multiling http
2021/09/27 04:32:41| Processing: acl CONNECT method CONNECT
2021/09/27 04:32:41| Processing: http_access deny !Safe_ports
2021/09/27 04:32:41| Processing: http_access deny CONNECT !SSL_ports
2021/09/27 04:32:41| Processing: http_access allow localhost manager
2021/09/27 04:32:41| Processing: http_access deny manager
2021/09/27 04:32:41| Processing: auth_param digest program /usr/lib64/squid/digest_file_auth -c /etc/squid/secrets/.digestpasswd
2021/09/27 04:32:41| Processing: auth_param digest children 20 startup=0 idle=1
2021/09/27 04:32:41| Processing: auth_param digest realm Squid proxy-caching web server. It uses digest authentication.
2021/09/27 04:32:41| Processing: auth_param digest nonce_garbage_interval 5 minutes
2021/09/27 04:32:41| Processing: auth_param digest nonce_max_duration 30 minutes
2021/09/27 04:32:41| Processing: auth_param digest nonce_max_count 50
2021/09/27 04:32:41| Processing: acl auth_users proxy_auth REQUIRED
2021/09/27 04:32:41| Processing: http_access allow localnet auth_users
2021/09/27 04:32:41| Processing: http_access allow localhost
2021/09/27 04:32:41| Processing: http_access deny all
2021/09/27 04:32:41| Processing: http_port 0.0.0.0:8080
2021/09/27 04:32:41| Processing: coredump_dir /var/spool/squid
2021/09/27 04:32:41| Processing: refresh_pattern ^ftp:          1440    20%     10080
2021/09/27 04:32:41| Processing: refresh_pattern ^gopher:       1440    0%      1440
2021/09/27 04:32:41| Processing: refresh_pattern -i (/cgi-bin/|\?) 0    0%      0
2021/09/27 04:32:41| Processing: refresh_pattern .              0       20%     4320
2021/09/27 04:32:41| Processing: forwarded_for off
2021/09/27 04:32:41| Processing: request_header_access Referer deny all
2021/09/27 04:32:41| Processing: request_header_access X-Forwarded-For deny all
2021/09/27 04:32:41| Processing: request_header_access Via deny all
2021/09/27 04:32:41| Processing: request_header_access Cache-Control deny all
2021/09/27 04:32:41| Processing: httpd_suppress_version_string on
2021/09/27 04:32:41| Processing: visible_hostname unknown
2021/09/27 04:32:41| Processing: logformat combined %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
2021/09/27 04:32:41| Processing: access_log /var/log/squid/access.log combined
2021/09/27 04:32:41| Initializing https proxy context
+ systemctl start squid
+ systemctl status squid
● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-09-27 04:32:41 UTC; 8ms ago
  Process: 6892 ExecStart=/usr/sbin/squid $SQUID_OPTS -f $SQUID_CONF (code=exited, status=0/SUCCESS)
  Process: 6886 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)
 Main PID: 6894 (squid)
   CGroup: /system.slice/squid.service
           └─6894 /usr/sbin/squid -f /etc/squid/squid.conf

Sep 27 04:32:41 ip-10-0-0-83.ec2.internal systemd[1]: Starting Squid caching proxy...
Sep 27 04:32:41 ip-10-0-0-83.ec2.internal systemd[1]: Started Squid caching proxy.
Sep 27 04:32:41 ip-10-0-0-83.ec2.internal squid[6894]: Squid Parent: will start 1 kids
+ systemctl enable squid
Created symlink from /etc/systemd/system/multi-user.target.wants/squid.service to /usr/lib/systemd/system/squid.service.
+ systemctl is-enabled squid
enabled

CloudWatch Agentのインストール・設定

/var/log/messages/var/log/squid/access.logをCloudWatch Logsに出力したいので、EC2インスタンスにCloudWatch Agentのインストールと設定を行います。

設定手順は以下記事のCloudWatch Agentのインストール・設定と同じ手順で行いました。

実行すると、以下の通りCloudWatch Logsに/var/log/messagesのログが出力されています。

/var/log/messages のCloudWatch Logsへの出力確認

なお、現時点では認証プロキシサーバーを経由した通信が発生していないため、/var/log/squid/access.logのログは出力されていません。

ちなみに、Squidのログは/etc/logrotate.d/squidでログローテートの設定がデフォルトでされていました。ローテーション周りの設定はweeklyの指定のみでmaxsizeの指定がないため、大量のアクセスがあった場合はログがディスクを圧迫する可能性があるので、本番運用する場合は気をつける必要がありますね。

/etc/logrotate.d/squid

/var/log/squid/*.log {
    weekly
    rotate 5
    compress
    notifempty
    missingok
    nocreate
    sharedscripts
    postrotate
      # Asks squid to reopen its logs. (logfile_rotate 0 is set in squid.conf)
      # errors redirected to make it silent if squid is not running
      /usr/sbin/squid -k rotate 2>/dev/null
      # Wait a little to allow Squid to catch up before the logs is compressed
      sleep 1
    endscript
}

EFSファイルシステムのマウント

EFSファイルシステムを認証プロキシサーバーにマウントします。

マウントポイントはUser DataでDigest認証用ユーザーファイルの保存先ディレクトリとして作成した、/etc/squid/secretsを指定します。

EFSファイルシステムのマウントコマンドはマネージメントコンソールから確認できます。

マネージメントコンソール上でマウントしたいEFSファイルシステムを選択し、アタッチをクリックします。

EFSファイルシステムのマウント

すると、EFSファイルシステムのマウントコマンドが表示されます。今回は、EC2インスタンスにEFSマウントヘルパーをインストールしていないので、NFSクライアントの使用の方のコマンドを参考にします。

EFSファイルシステムのマウントコマンドの確認

EFSファイルシステムのマウントコマンドの実行は、SSM Run Commandを使用して、2台の認証プロキシサーバー用のEC2インスタンスに対して同時に行います。

コマンドドキュメントでAWS-RunShellScriptを選択し、以下コマンドを入力して、2台の認証プロキシサーバー用のEC2インスタンスを指定して実行します。

# Mount the EFS file system in /etc/squid/secrets
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-c9d1d87d.efs.us-east-1.amazonaws.com:/ /etc/squid/secrets

# Check the mount
mount | grep nfs

# Check disk size
df -h

EFSファイルシステムをマウントするコマンドの実行1

EFSファイルシステムをマウントするコマンドの実行2

実行が完了すると、以下のようにステータスが成功となりました。

EFSファイルシステムのマウントコマンドの実行結果の確認

ログを確認すると、意図した通り/etc/squid/secretsにEFSファイルシステムがマウントされていることが確認できます。

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
fs-c9d1d87d.efs.us-east-1.amazonaws.com:/ on /etc/squid/secrets type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.81,local_lock=none,addr=10.0.0.157)
Filesystem                                 Size  Used Avail Use% Mounted on
devtmpfs                                   468M     0  468M   0% /dev
tmpfs                                      479M   12K  479M   1% /dev/shm
tmpfs                                      479M  412K  479M   1% /run
tmpfs                                      479M     0  479M   0% /sys/fs/cgroup
/dev/nvme0n1p1                             8.0G  2.0G  6.0G  26% /
tmpfs                                       96M     0   96M   0% /run/user/0
fs-c9d1d87d.efs.us-east-1.amazonaws.com:/  8.0E     0  8.0E   0% /etc/squid/secrets

EFSファイルシステムのマウントコマンドの実行結果のログの確認

正しくマウントできることを確認したので、OS再起動をしてもEFSファイルシステムをマウントするように/etc/fstabも設定します。

マウントオプションはこちらのAWS公式ドキュメントを参考に設定します。

# Check /etc/fstabfstab before changing settings
sudo cat /etc/fstab

# Add a setting to /etc/fstab to mount EFS filesystem to /etc/squid/secrets
sudo sh -c "echo fs-c9d1d87d.efs.us-east-1.amazonaws.com:/ /etc/squid/secrets nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0 >> /etc/fstab"

# Check /etc/fstabfstab after changing settings
sudo cat /etc/fstab

実行すると、以下のようなログが出力されており、/etc/fstabにEFSファイルシステムを/etc/squid/secretsにマウントする設定が追加されたことが確認できます。

#
UUID=55ee5a5f-d155-47e0-9121-e6f4522cb2bf     /           xfs    defaults,noatime  1   1
#
UUID=55ee5a5f-d155-47e0-9121-e6f4522cb2bf     /           xfs    defaults,noatime  1   1
fs-c9d1d87d.efs.us-east-1.amazonaws.com:/ /etc/squid/secrets nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,_netdev 0 0

プロキシ認証用ユーザーの作成

Squidの設定の確認

プロキシ認証用ユーザーする前に、Squidの設定(/etc/squid/squid.conf)について確認します。

/etc/squid/squid.conf全体は以下の通りです。

/etc/squid/squid.conf

#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/24

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed

# Require digest authentication.
auth_param digest program /usr/lib64/squid/digest_file_auth -c /etc/squid/secrets/.digestpasswd
auth_param digest children 20 startup=0 idle=1
auth_param digest realm Squid proxy-caching web server. It uses digest authentication.
auth_param digest nonce_garbage_interval 5 minutes
auth_param digest nonce_max_duration 30 minutes
auth_param digest nonce_max_count 50
acl auth_users proxy_auth REQUIRED

http_access allow localnet auth_users
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 0.0.0.0:8080

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

# Hiding client and proxy information
forwarded_for off
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

#  Don't display the version on the error page.
httpd_suppress_version_string on

# Anonymize hostnames
visible_hostname unknown

# Setting log format to Apache combined
logformat combined %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /var/log/squid/access.log combined

AWS CDKでEC2インスタンスをデプロイした際のUser Dataである./src/ec2/userDataSettingSquid.shで変更した箇所を中心に確認します。

クライアントのIPアドレスの範囲の指定

まず、クライアントのIPアドレスの範囲を指定します。

今回はVPCのCIDR(10.0.0.0/24)以外のIPアドレスからのアクセスは許可しないので、localnetというACL名で、クライアントのIPアドレスの範囲10.0.0.0/24を指定しています。

/etc/squid/squid.conf

acl localnet src 10.0.0.0/24

Digest認証および、ACLに対しての制御

次に、Digest認証および、ACLに対しての制御をしています。

Squidの公式ドキュメントを参考に指定しました。各設定項目について、コメントで補足しています。

/etc/squid/squid.conf

# 認証を行うプログラムとを指定
# 今回はSquidインストール時に作成された /usr/lib64/squid/digest_file_auth を指定
# プロキシ認証用ユーザーファイルとして /etc/squid/secrets/.digestpasswd を指定
# パスワードをハッシュ化しているため、-c オプションを追加する、
auth_param digest program /usr/lib64/squid/digest_file_auth -c /etc/squid/secrets/.digestpasswd

# 認証処理のプロセスの最大起動数を指定
auth_param digest children 20 startup=0 idle=1

# realmを指定
# 認証をする際に設定した値がクライアントに表示される
auth_param digest realm Squid proxy-caching web server. It uses digest authentication.

# クライアントで発行されたnonceの有効性をチェックする間隔を指定
auth_param digest nonce_garbage_interval 5 minutes

# 指定されたnonceが有効である最大時間を指定
auth_param digest nonce_max_duration 30 minutes

# 与えられたnonceの最大使用回数を指定
auth_param digest nonce_max_count 50

# プロキシ認証用ユーザーファイルに登録されたすべてのユーザーを認証対象として指定
acl auth_users proxy_auth REQUIRED

# localnet(10.0.0.0/24)内からのアクセスは認証した上で許可する
http_access allow localnet auth_users

# localhostからの通信を許可する
http_access allow localhost

不必要な情報の削除

接続先のWebサーバーや接続元のクライアントに対して、不必要に情報を教えたくないので、以下のように設定しました。

/etc/squid/squid.conf

# クライアントのIPアドレスを追加しない
forwarded_for off

# HTTPヘッダーから、各種情報を削除する。
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

#  エラーページにSquidのバージョンを表示させない
httpd_suppress_version_string on

# ホスト名を非表示
visible_hostname unknown

ログフォーマットの設定

SquidのデフォルトのログフォーマットだとUNIX時間で出力されます。一般人がUNIX時間を見るのはなかなか辛いので、Apache HTTP Serverのログの様に、combined形式に変更します。

/etc/squid/squid.conf

logformat combined %>a %[ui %[un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /var/log/squid/access.log combined

プロキシ認証用ユーザーの作成

それでは、プロキシ認証用ユーザーを作成します。

プロキシ認証用ユーザーの作成には、User Dataでインストールしたhttpd-toolsに含まれるhtdigestコマンドを使用します。

以下コマンドで、/etc/squid/secrets/.digestpasswdにプロキシ認証用ユーザーnon-97の情報を追加します。パスワードはユーザーIDと同じnon-97にしました。

$ sudo htdigest -c /etc/squid/secrets/.digestpasswd "Squid proxy-caching web server. It uses digest authentication." non-97
Adding password for non-97 in realm Squid proxy-caching web server. It uses digest authentication..
New password: 
Re-type new password:

作成した/etc/squid/secrets/.digestpasswdを確認すると、パスワードnon-97568ee16a85bdf37b9043f3260329a847にハッシュ化されていることが確認できます。

$ ls -la /etc/squid/secrets/.digestpasswd
-rw-r--r-- 1 root root 103 Sep 24 06:42 /etc/squid/secrets/.digestpasswd

$ sudo cat /etc/squid/secrets/.digestpasswd
non-97:Squid proxy-caching web server. It uses digest authentication.:568ee16a85bdf37b9043f3260329a847

ちなみに、ハッシュ化された文字列はユーザーIDとパスワード、realmを:で結合した文字列をMD5でハッシュ化したものです。

そのため、以下のようにmd5sumコマンドでハッシュ値を求めることもできます。

# "echo" は末尾に改行文字が入るため、"-n" で改行文字を追加せずに、"md5sum" に渡す
$ echo -n "non-97:Squid proxy-caching web server. It uses digest authentication.:non-97" | md5sum
568ee16a85bdf37b9043f3260329a847  -

動作確認

プロキシの設定

クライアント用のWindows Serverにログインして、プロキシの設定をします。

クライアントとなるWindows ServerへのログインはSSMセッションマネージャーのポートフォワーディング機能を使って、RDP接続をします。

以下コマンドで、ポートフォワーディングによる接続を確立させたのち、RDPクライアントでRDP接続を行います。

> aws ssm start-session --target i-05536fe459639e1d4 --document-name AWS-StartPortForwardingSession --parameters portNumber=3389,localPortNumber=13389
Enter MFA code for arn:aws:iam::<AWSアカウントID>:mfa/<IAMユーザー名>:

Starting session with SessionId: botocore-session-1632473086-0cb51cdab36846b70
Port 13389 opened for sessionId botocore-session-1632473086-0cb51cdab36846b70.
Waiting for connections...

Connection accepted for session [botocore-session-1632473086-0cb51cdab36846b70]

RDP接続

IEを起動して、NLBのDNS名proxy-nlbbc-833edw0y5wj8-17b2194480b9e4d2.elb.us-east-1.amazonaws.comをプロキシサーバーのアドレスとして指定します。

プロキシサーバーの指定

これで準備OKです。

認証プロキシサーバーが2台起動している場合の動作

試しにIEから、 DevelopersIO (https://dev.classmethod.jp/) にアクセスしてみます。

アドレスバーに https://dev.classmethod.jp/ を入力して、アクセスすると認証のポップアップが表示されました。

プロキシの認証ポップアップ

サーバーからの報告に、指定したrealmであるSquid proxy-caching web server. It uses digest authentication.が表示されていることも確認できますね。

プロキシ認証用のユーザーIDとパスワードを入力して、OKをクリックすると、正常にDevelopersIOにアクセスできました。

DevelopersIOへのアクセス確認

CloudWatch Logsにて、Squidのアクセスログである/var/log/squid/access.logロググループを確認すると、ユーザーnon-97で認証をして、 https://dev.classmethod.jp/ にアクセスした際のログが記録されています。

DevelopersIOにアクセスした際のCloudWatch Logs

10.0.0.149 - - [24/Sep/2021:08:59:08 +0000] "CONNECT dev.classmethod.jp:443 HTTP/1.0" 407 4240 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_DENIED:HIER_NONE
10.0.0.149 - non-97 [24/Sep/2021:09:04:03 +0000] "CONNECT dev.classmethod.jp:443 HTTP/1.0" 200 407153 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_TUNNEL:HIER_DIRECT
10.0.0.149 - non-97 [24/Sep/2021:09:07:03 +0000] "CONNECT dev.classmethod.jp:443 HTTP/1.0" 407 4606 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_DENIED:HIER_NONE
10.0.0.149 - non-97 [24/Sep/2021:09:07:08 +0000] "CONNECT dev.classmethod.jp:443 HTTP/1.0" 200 46082 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_TUNNEL:HIER_DIRECT

続いて、正常に負荷分散されているか確認するために、アクセス元のグローバルIPアドレスを表示する http://checkip.amazonaws.com/ に数回アクセスして、表示されるIPアドレスが変わるのか確認します。

http://checkip.amazonaws.com/ にアクセスし、何回かリロードしましたがIPアドレスは変わらず、44.195.212.104でした。

認証プロキシサーバーの負荷分散確認1

こちらのグローバルIPアドレスはus-east-1bのNAT Gatewayに割り当てているElastic IPアドレスです。

us-east-1bのNAT Gatewayに割り当てているElastic IPアドレス

試しに、別のタブで http://checkip.amazonaws.com/ にアクセスすると、こちらは44.199.158.44が表示されました。

認証プロキシサーバーの負荷分散確認2

こちらのグローバルIPアドレスはus-east-1aのNAT Gatewayに割り当てているElastic IPアドレスです。

us-east-1aのNAT Gatewayに割り当てているElastic IPアドレス

正しく振り分けられているようですね。また、複数の認証プロキシサーバーに振り分けられても再度認証は発生しないようですね。

認証プロキシサーバーを1台停止させた場合の動作

次に、認証プロキシサーバーを1台停止させた場合の動作を確認します。

試しにus-east-1bの認証プロキシサーバーを停止させました。

us-east-1bの認証プロキシサーバーの停止

ターゲットグループを確認すると、確かにus-east-1bの認証プロキシサーバーのステータスが、unhealthyになっています。

認証プロキシサーバーを1台停止させた場合のターゲットグループ

この状態で各タブをリロードすると、どちらもus-east-1aのNAT Gatewayに割り当てているElastic IPアドレスである44.199.158.44が表示されるようになりました。(見やすくする度にタブをウィンドウに分けて並べています)

認証プロキシサーバーを1台停止させた場合のアクセス確認

正常に稼働している方の認証プロキシサーバーにのみ、アクセスが振り分けられていることが確認できます。

認証プロキシサーバーを全て停止させた場合の動作

なんとなく、認証プロキシサーバーを全て停止させた場合の動作も確認します。

us-east-1aの認証プロキシサーバーを追加で停止させました。ターゲットグループを確認すると、どちらの認証プロキシサーバーのステータスもunhealthyになっていました。

認証プロキシサーバーを2台停止させた場合のターゲットグループ

この状態で各タブをリロードすると、どちらもプロキシ サーバーは応答していませんと表示されるようになりました。

認証プロキシサーバーを2台停止させた場合のアクセス確認

当然ですね。

それでは、/etc/fstabが正常に設定されていることを確認するために、認証プロキシサーバーを2台とも起動して、http://checkip.amazonaws.com/ にアクセスしてみます。

認証プロキシサーバーを2台とも起動させた場合のターゲットグループ

この状態でブラウザをリロードすると、特に再認証はされず、44.199.158.44が表示されるようになりました。

認証プロキシサーバー再起動後のアクセス

/etc/fstabが正常に設定されており、再起動後もEFSファイルシステムをマウントできていそうですね。

プロキシ認証用ユーザーを追加した時の動作

最後にプロキシ認証用ユーザーを追加した時の動作確認をします。

まず、OSに保存されているプロキシ認証用ユーザーの資格情報を削除します。

コンパトロールパネルを開き、ユーザーアカウント - 資格情報マネージャーを開きます。Windows資格情報からプロキシサーバーのDNS名(今回はproxy-nlbbc-833edw0y5wj8-17b2194480b9e4d2.elb.us-east-1.amazonaws.com)の資格情報を展開し、ユーザーIDがnon-97であることを確認し削除をクリックします。

OSに保存されているプロキシ認証用ユーザーの資格情報の削除

削除する資格情報が正しいことを確認して、はいをクリックします。

資格情報の削除確認

次に、認証プロキシサーバーにログインして、以下コマンドでプロキシ認証用ユーザーnonpiを追加します。

$ sudo htdigest /etc/squid/secrets/.digestpasswd "Squid proxy-caching web server. It uses digest authentication." nonpi
Adding user nonpi in realm Squid proxy-caching web server. It uses digest authentication.
New password: 
Re-type new password:

htdigestコマンドで2つ目以降の認証用ユーザーを作成する際は、ファイルパスの前に-cを付けないようにします。仮に-cを付けると、 Apache HTTP Serverの htdigest コマンド公式ドキュメントで紹介されているとおり、追記ではなく、ファイルを上書きしてしまいます。

/etc/squid/secrets/.digestpasswdを表示すると、nonpiの行が追加されていることが確認できます。

$ sudo cat /etc/squid/secrets/.digestpasswd
non-97:Squid proxy-caching web server. It uses digest authentication.:568ee16a85bdf37b9043f3260329a847
nonpi:Squid proxy-caching web server. It uses digest authentication.:ca4bd989702ade54229f2de8d1efc212

IEを全て閉じて、再度IEを立ち上げると認証のポップアップが表示されました。

プロキシの認証ポップアップ2

追加したプロキシ認証用ユーザーnonpiの認証情報を入力して、OKをクリックすると、正常にアクセスできました。Squidのサービスの再起動や設定のリロードは不要みたいですね。

追加したプロキシ認証ユーザーでのブラウジング

資格情報マネージャーを確認すると、プロキシ認証用ユーザーnonpiの資格情報が追加されていました。

OSに保存されているプロキシ認証用ユーザーnonpiの資格情報確認

また、CloudWatch Logsにて、/var/log/squid/access.logロググループを確認すると、ユーザーnonpiで認証をして、http://checkip.amazonaws.com/ にアクセスした際のログが記録されています。

nonpiで認証した際のCloudWatch Logs

10.0.0.149 - nonpi [24/Sep/2021:10:36:44 +0000] "GET http://checkip.amazonaws.com/ HTTP/1.1" 407 4790 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_DENIED:HIER_NONE
10.0.0.149 - nonpi [24/Sep/2021:10:36:44 +0000] "GET http://checkip.amazonaws.com/ HTTP/1.1" 200 233 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_MISS:HIER_DIRECT

認証プロキシサーバーのAuto Scallingもしてみた

どうせなら負荷状況に応じてスケーリングもさせたい

認証プロキシサーバーを冗長化できていることを確認できました。

ですが、ここまで設定したのであれば、負荷状況に応じてスケーリングできるようにしたいなと思いました。

そこで、認証プロキシサーバーをAuto Scallingで、負荷状況に応じてスケーリングさせたいと思います。

AMIの作成

Auto Scallingさせるためには、起動テンプレートが必要となります。また、起動テンプレートを作成する際には、起動に使うAMIを指定する必要があります。そのため、まず認証プロキシサーバーのAMIを作成します。

認証プロキシサーバーを選択して、アクション - イメージとテンプレート - イメージを作成をクリックします。そして、イメージ名や、Nameタグを入力して、イメージを作成をクリックします。

AMIの作成

作成したAMIのステータスがavailableになることを確認します。

作成したAMIの確認

起動テンプレートの作成

AMIの作成が完了したので、起動テンプレートを作成します。

まず、テンプレートの起動から起動テンプレートを作成をクリックします。

起動テンプレートの作成

続いて、起動テンプレート名やAMI、インスタンスタイプなど必要な情報を設定し、起動テンプレートを作成をクリックします。なお、EC2 Auto Scallingで使用できるテンプレートをセットアップする際に役立つガイダンスを提供にチェックを入れることで、Auto Scallingで使用する際に設定すべき項目が分かりやすくなります。

起動テンプレートの作成ステップ1

起動テンプレートの作成ステップ2

起動テンプレートの作成ステップ3

起動テンプレートの作成ステップ4

起動テンプレートの作成に成功すると、以下のような画面が表示されます。作成した起動テンプレートを確認する際は、起動テンプレートを表示をクリックします。

起動テンプレートの作成完了

起動テンプレートを表示をクリックすると、確かに起動テンプレートが作成されていることが確認できます。

作成した起動テンプレートの確認

Auto Scalling Groupの作成

起動テンプレートの作成が完了したので、Auto Scalling Groupを作成します。

まず、Auto Scalling グループを作成するをクリックします。

Auto Scalling Groupの作成

続いて、Auto Scalling Groupの名前および、起動テンプレートを設定して、次へをクリックします。

Auto Scalling Groupの作成ステップ1

次に、Auto Scallingで作成されるEC2インスタンスの購入オプションや、起動するネットワークを設定します。設定が完了したら、次へをクリックします。

Auto Scalling Groupの作成ステップ2

次に、Auto Scallingで作成されるEC2インスタンスに接続するロードバランサーの設定を行います。設定が完了したら、次へをクリックします。

Auto Scalling Groupの作成ステップ3

次に、スケーリングのポリシーを指定します。今回はCPU使用率に応じて最大4台までスケーリングするよう設定しました。設定が完了したら、次へをクリックします。

Auto Scalling Groupの作成ステップ4

次に、スケーリング時の通知の設定です。今回は設定しないので、何もせずに次へをクリックします。

Auto Scalling Groupの作成ステップ5

次に、タグの設定です。こちらも今回は設定しないので、何もせずに次へをクリックします。

Auto Scalling Groupの作成ステップ6

最後に設定の確認です。設定を確認して問題なければ、Auto Scalling グループの作成をクリックします。

Auto Scalling Groupの作成ステップ7_1

Auto Scalling Groupの作成ステップ7_2

動作確認

それでは、Auto Scallingの動作確認を行います。

Auto Scalling Groupを作成して、しばらくすると、ターゲットグループにEC2インスタンスが2台追加されました。

ターゲットグループへのAuto ScallingしたEC2インスタンスの登録確認

スケーリングポリシーとして「平均CPU使用率が50%以上の時スケーリングする」と設定しました。せっかくなので、EC2インスタンスのCPUに負荷をかけて、正しくスケーリングするかも確認します。

CPUに負荷をかけるために、Auto Scallingで追加された各EC2インスタンスで、以下コマンドを実行します。こちらは複数のCPUコア数分、暗号アルゴリズムのパフォーマンスをテストするコマンドです。

$ openssl speed -multi `grep processor /proc/cpuinfo|wc -l`

上述のコマンドを実行して、しばらくすると、CPU使用率が50%を超えていることが確認できました。

CPU使用率の確認

ターゲットグループを確認すると、確かに1台EC2インスタンスが追加されていました。

CPUが高負荷状態のターゲットグループの確認

追加されたEC2インスタンスのステータスがhealthyになった後、認証プロキシが正常に動作するかも確認します。

資格情報を削除して、IEを再起動すると、認証のポップアップが表示されました。また、認証後は意図したサイトにアクセスできることも確認できました。

Auto Scalling後のプロキシの認証確認

Auto Scalling後のプロキシの動作確認

EFSとNLBを使えば簡単に認証プロキシサーバーを冗長化できるよ

特別な設定は必要なく、NLB + EFS + Squidで、認証プロキシサーバーの冗長化を行うことができました。

Squidは触るのは2年ぶりぐらいだったので、良いリハビリになりました。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!