Sử dụng AWS Distro cho OpenTelemetry và IAM Roles Anywhere on-premises để nhập số liệu vào Amazon Managed Service cho Prometheus

Khách hàng sử dụng Prometheus trong môi trường tự lưu trữ phải đối mặt với những thách thức trong việc quản lý môi trường máy chủ Prometheus có tính sẵn sàng cao, khả năng mở rộng và bảo mật, cơ sở hạ tầng để lưu trữ lâu dài và kiểm soát truy cập.  Amazon Managed Service for Prometheus, một dịch vụ giám sát tương thích với Prometheus dành cho các chỉ số ứng dụng và cơ sở hạ tầng, giải quyết những vấn đề này bằng cách cung cấp một môi trường được quản lý toàn phần, được tích hợp chặt chẽ với AWS Identity and Access Management (IAM) để kiểm soát xác thực và ủy quyền. Ngoài việc giám sát workload của bộ chứa chạy trên Amazon Elastic Kubernetes Service (Amazon EKS)/Amazon Elastic Container Service (Amazon ECS), khách hàng cũng có thể sử dụng Amazon Managed Service cho Prometheus để giám sát workload đang chạy trong môi trường tại chỗ của họ hoặc Amazon Elastic Compute Cloud (Amazon EC2) instances, sử dụng Open Telemetry collector.

Định cấu hình trình thu thập phép đo từ xa mở cho môi trường tại chỗ có thể đặt ra một thách thức vì bạn có thể cần cung cấp quyền programmatic access cho các ứng dụng của mình. Khóa truy cập tạm thời sử dụng  AWS Security Token Service (AWS STS), được khuyến nghị cho các thông tin đăng nhập dài hạn, để có trạng thái bảo mật tốt hơn và tuân thủ các phương pháp hay nhất như xoay vòng thông tin đăng nhập, không từ chối hành động do chia sẻ thông tin đăng nhập trên nhiều ứng dụng hoặc người dùng. Tuy nhiên, điều này yêu cầu sử dụng identity federation (SAML, OIDC, v.v.) và thêm chi phí phức tạp và bảo trì.

Trong bài đăng này, chúng tôi trình bày cách truy cập theo chương trình các tài nguyên AWS đang chạy tại chỗ của bạn bằng cách sử dụng IAM Roles Anywhere. IAM Roles Anywhere cho phép workload của bạn như máy chủ, bộ chứa và ứng dụng sử dụng digital certificates X.509 để lấy thông tin xác thực AWS tạm thời, đồng thời sử dụng cùng vai trò và chính sách IAM mà bạn đã định cấu hình cho workload AWS của mình để truy cập tài nguyên AWS. Chúng tôi chỉ cho bạn cách gửi số liệu từ workload tại chỗ của bạn tới Amazon Managed Service cho Prometheus bằng cách sử dụng phương pháp này.

IAM Roles Anywhere sử dụng mối quan hệ tin cậy giữa môi trường AWS và cơ sở hạ tầng khóa công khai (PKI) của bạn. Sơ đồ sau đây thể hiện mối quan hệ này. Điểm neo tin cậy, được cả workload tại chỗ và môi trường AWS của bạn tin cậy, sẽ cho phép truy xuất an toàn thông tin đăng nhập tạm thời bằng Certificate X509 do cơ quan (common) đáng tin cậy cấp.

Hình 1 . IAM Roles Anywhere trust relationship

Để đơn giản, chúng tôi sẽ sử dụng AWS Private Certificate Authority làm cơ sở hạ tầng khóa công khai trong bài đăng này, nhưng bạn có thể tìm hướng dẫn về cách sử dụng Certificate Authority của riêng mình trong tài liệu IAM Roles Anywhere

Tổng quan về giải pháp

Sơ đồ sau đây cho thấy cấu trúc giải pháp. Tất cả các bước ở bên trái có thể được thực thi trong AWS CloudShell (miễn là người dùng của bạn có quyền phù hợp), trong khi các bước ở bên phải phải được thực thi trong máy từ xa của bạn. Blog này được viết bằng Ubuntu 22.04.1 (LTS), bạn có thể cần điều chỉnh hướng dẫn nếu sử dụng hệ thống khác.

Hình 2. Tổng quan về giải pháp

Các BướcTerminalMiêu tả
1CloudShellTạo một AWS Private CA trong Tài khoản AWS của bạn với certificate tự ký sẽ đóng vai trò là cơ quan đáng tin cậy chung.
2CloudShellTạo Trust Anchor trên IAM Roles Anywhere để thiết lập niềm tin với AWS Private CA đã tạo ở bước trước.
3CloudShellTạo IAM Role với quyền ghi vào bất kỳ Amazon Managed Service cho Prometheus Workspace và với điều kiện vai trò giả định bị hạn chế.
4CloudShellTạo hồ sơ IAM Role ở mọi nơi để cho phép workload đáng tin cậy đảm nhận vai trò được tạo ở bước trước.
5CloudShellTạo Amazon Managed Service cho Prometheus Workspace để nhận số liệu từ workload. Ở bước này, lệnh cuối cùng sẽ in tất cả các giá trị (ở dạng biến môi trường) phải được sao chép vào môi trường workload để thực hiện các bước tiếp theo.
6Virtual Machine(Tùy chọn) Cài đặt Prometheus node exporte trong workload. Bước tùy chọn này sẽ cung cấp thông tin chi tiết hơn về máy ảo nhưng không bắt buộc.
7Virtual MachineTải xuống và cài đặt AWS Distro cho OpenTelemetry Collector (ADOT Collector) và chuẩn bị thư mục chính cho người dùng mặc định (aoc).
8Virtual MachineCài đặt công cụ trợ giúp AWS Signing do IAM Roles Anywhere cung cấp.
9Virtual MachineTạo RSA key pair và Certificate request cho workload. Lệnh cuối cùng sẽ in Certificate request phải được sao chép sang AWS Environment  cho bước tiếp theo.
10aCloudShellSử dụng AWS Private CA, cấp certificate cho workload dựa trên yêu cầu được tạo ở bước trước. Lệnh cuối cùng sẽ in certificate workload phải được sao chép vào môi trường workload để thực hiện các bước tiếp theo.
10bVirtual MachineSao chép tất cả các tệp cần thiết cho công cụ trợ giúp AWS Signing vào thư mục chính của aoc và định cấu hình các quyền phù hợp.
11Virtual MachineĐịnh cấu hình quy trình xác thực được AWS SDK for Go sử dụng để sử dụng công cụ trợ giúp AWS Signing, kết hợp với key và certificate được tạo ở các bước trước, để tạo thông tin xác thực tạm thời cho ADOT Collector. Định cấu hình ADOT Collector để sử dụng SDK for Go, ghi số liệu vào workspace Amazon Managed Service cho Prometheus được tạo ở Bước 5 và khởi động .

Luồng dữ liệu trong giải pháp có thể được tách thành hai phần, thiết lập một lần về độ tin cậy và thông tin xác thực được giải thích trong blog này và một hoạt động liên tục trong đó thông tin xác thực tạm thời được tạo liên tục cho workload từ xa.

Phần trên cùng của sơ đồ data flow hiển thị sự tương tác giữa các dịch vụ hoặc thành phần khác nhau được mô tả trong bài đăng trên blog này để thiết lập IAM Roles Anywhere.

Phần dưới cùng của sơ đồ hiển thị quy trình trong đó ADOT Collector sử dụng công cụ AWS Signing để tạo phiên và đảm nhận vai trò được định cấu hình trong IAM Role Anywhere role profile. Bằng cách đó, thông tin xác thực tạm thời được trả lại cho người dùng ADOT Collector (AWS STS) và đến lượt chúng, chúng được sử dụng để ký yêu cầu ghi từ xa (sử dụng sigv4) trong tối đa 1 giờ (thời lượng phiên mặc định) cho đến khi thông tin đăng nhập hết hạn và quá trình này lặp lại lần nữa với một bộ certificate mới.

Hình 3. Data Flow

Điều kiện

Trong blog này, chúng tôi sẽ sử dụng hai thiết bị đầu cuối để dán các lệnh của mình. Đối với các lệnh mà bạn cần thực thi trên AWS Environment của mình, chúng tôi khuyên bạn nên sử dụng CloudShell. Để mở thiết bị đầu cuối CloudShell, bạn có thể làm theo các bước sau:

  • Đăng nhập vào AWS Management Console.
  • Từ AWS Management Console., bạn có thể khởi chạy CloudShell bằng cách chọn các tùy chọn sau có sẵn trên thanh điều hướng:
  1. Chọn biểu tượng CloudShell.
  2. Bắt đầu nhập “CloudShell” vào hộp Tìm kiếm rồi chọn tùy chọn CloudShell.

Hình 4. CloudShell launch options

Bạn có thể tìm thêm thông tin về CloudShell trong trang Getting started

Chuẩn bị AWS Environment của bạn

Lưu ý: Các lệnh sau phải được thực thi bởi người dùng có đặc quyền cao trên AWS Account của bạn. Bạn có thể chạy chúng bằng CloudShell.

1. Tạo AWS Private Certificate Authority

Lưu ý: Để sử dụng IAM Roles Anywhere, workloads của bạn phải sử dụng certificate X.509 do certificate authority (CA) của bạn cấp. Bạn đăng ký CA với IAM Roles Anywhere dưới dạng mỏ neo tin cậy để thiết lập sự tin cậy giữa public-key infrastructure (PKI) của bạn và IAM Roles Anywhere. Bạn cũng có thể sử dụng AWS Private Certificate Authority (AWS Private CA) để tạo CA rồi sử dụng CA đó để thiết lập niềm tin với IAM Roles Anywhere. AWS Private CA là dịch vụ CA riêng được quản lý để quản lý cơ sở hạ tầng CA và certificate riêng của bạn.

Sử dụng các lệnh sau để tạo tệp cấu hình và sử dụng nó để tạo AWS Private CA cũng như tạo và nhập self-signed Root Certificated cho Certificate Authority.

cat > ca_config.json << EOF

{

   “KeyAlgorithm”:”RSA_2048″,

   “SigningAlgorithm”:”SHA256WITHRSA”,

   “Subject”:{

      “Country”:”US”,

      “Organization”:”Example Corp”,

      “OrganizationalUnit”:”Sales”,

      “State”:”WA”,

      “Locality”:”Seattle”,

      “CommonName”:”www.example.com”

   }

}

EOF

PRIVATE_CA_ARN=$(aws acm-pca create-certificate-authority \

     –certificate-authority-configuration file://ca_config.json \

     –certificate-authority-type “ROOT” \

     –tags  Key=Name,Value=IAMRolesAnywhereRootCA \

     –query CertificateAuthorityArn \

     –output text)

echo “Private CA ARN: $PRIVATE_CA_ARN”     

echo “export PRIVATE_CA_ARN=$PRIVATE_CA_ARN” >> delete.env

aws acm-pca get-certificate-authority-csr \

     –certificate-authority-arn $PRIVATE_CA_ARN \

     –output text > ca.csr

ROOT_CERTIFICATE_ARN=$(aws acm-pca issue-certificate \

     –certificate-authority-arn $PRIVATE_CA_ARN \

     –csr fileb://ca.csr \

     –signing-algorithm SHA256WITHRSA \

     –template-arn arn:aws:acm-pca:::template/RootCACertificate/V1 \

     –validity Value=365,Type=DAYS \

     –query CertificateArn \

     –output text)

echo “Root Certificate ARN: $ROOT_CERTIFICATE_ARN”     

echo “export ROOT_CERTIFICATE_ARN=$ROOT_CERTIFICATE_ARN” >> delete.env

aws acm-pca get-certificate \

    –certificate-authority-arn $PRIVATE_CA_ARN \

    –certificate-arn $ROOT_CERTIFICATE_ARN \

    –output text > ca_cert.pem

aws acm-pca import-certificate-authority-certificate \

     –certificate-authority-arn $PRIVATE_CA_ARN \

     –certificate fileb://ca_cert.pem

2. TạoTrust Anchor cho IAM Roles Anywhere

Sử dụng các lệnh sau để tạo Trust Anchor cho IAM Roles Anywhere. Anchor sẽ thiết lập sự tin cậy giữa IAM Roles Anywhere và AWS Private CA được tạo ở bước trước:

TA_ID=$(aws rolesanywhere create-trust-anchor \

     –name ExternalWorkers \

    –source “sourceData={acmPcaArn=$PRIVATE_CA_ARN},sourceType=AWS_ACM_PCA” \

    –enabled \

    –query trustAnchor.trustAnchorId \

    –output text)

TA_ARN=$(aws rolesanywhere get-trust-anchor \

    –trust-anchor-id $TA_ID \

    –query trustAnchor.trustAnchorArn \

    –output text)

echo “IAM Roles Anywhere Trust Anchor: $TA_ID”     

echo “export TA_ID=$TA_ID” >> delete.env

echo “IAM Roles Anywhere Trust Anchor ARN: $TA_ARN”     

echo “export TA_ARN=$TA_ARN” >> delete.env

3. Tạo IAM Role cho workloads của bạn với các quyền cần thiết

Tạo IAM Role sẽ do workload của bạn đảm nhận bằng cách sử dụng IAM Roles Anywhere. Vì mục đích của blog này, vai trò này sẽ chỉ có quyền ghi vào các Amazon Managed services dành cho Prometheus endpoint bằng chính sách được quản lý AmazonPrometheusRemoteWriteAccess.

Bạn nên thêm các điều kiện vào Trust Policy dựa trên các thuộc tính được trích xuất từ X509 Certificate như được mô tả trong tài liệu. Trong trường hợp của chúng tôi, chúng tôi đã thêm một điều kiện là Common Name (CN) trong certificate phải khớp với value VM01.

cat > RolesAnywhere-Trust.json << EOF

{

    “Version”: “2012-10-17”,

    “Statement”: [

        {

            “Sid”: “”,

            “Effect”: “Allow”,

            “Principal”: {

                “Service”: “rolesanywhere.amazonaws.com”

            },

            “Action”: [

                “sts:AssumeRole”,

                “sts:SetSourceIdentity”,

                “sts:TagSession”

            ],

            “Condition”: {

                “StringEquals”: {

                “aws:PrincipalTag/x509Subject/CN”: “VM01”

            }

        }            

        }

    ]

}

EOF

REMOTE_ROLE=$(aws iam create-role \

    –role-name ExternalPrometheusRemoteWrite \

    –assume-role-policy-document file://RolesAnywhere-Trust.json \

    –query Role.Arn –output text)

aws iam attach-role-policy \

    –role-name ExternalPrometheusRemoteWrite \

    –policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess   

echo “Remote workload IAM Role: $REMOTE_ROLE”     

echo “export REMOTE_ROLE=$REMOTE_ROLE” >> delete.env

4. Tạo IAM Role Anywhere Profiles

IAM Roles Anywhere profiles chỉ định những vai trò IAM Roles Anywhere đảm nhận và workloads của bạn có thể thực hiện với thông tin xác thực tạm thời. Trong một profile, bạn có thể xác định session policy để giới hạn quyền đối với session đã tạo. Xem thêm chi tiết về session policies trong tài liệu IAM.

Sử dụng các lệnh bên dưới để tạo hồ sơ và cho trusted workloads đảm nhận IAM Role mà chúng ta vừa tạo

PROFILE_ID=$(aws rolesanywhere create-profile \

     –name PrometheusExternal \

    –role-arns $REMOTE_ROLE \

    –enabled \

    –query profile.profileId \

    –output text)

PROFILE_ID_ARN=$(aws rolesanywhere get-profile \

    –profile-id $PROFILE_ID \

    –query profile.profileArn \

    –output text)

echo “IAM Roles Anywhere profile ID: $PROFILE_ID”     

echo “export PROFILE_ID=$PROFILE_ID” >> delete.env

echo “IAM Roles Anywhere profile ID ARN: $PROFILE_ID_ARN”     

echo “export PROFILE_ID_ARN=$PROFILE_ID_ARN” >> delete.env

5. Tạo Amazon Managed Service cho Prometheus Workspace

Tập lệnh bên dưới sẽ tạo một Amazon Managed Service cho Prometheus workspace ở region US-EAST-1. Nếu muốn, hãy thay đổi biến WORKLOAD_REGION thành region được hỗ trợ được đề cập trong tài liệu tại đây.

WORKLOAD_REGION=’us-east-1′

WORKSPACE_ID=$(aws amp create-workspace –alias onpremises-demo-workspace \

  –region $WORKLOAD_REGION \

  –output text \

  –query ‘workspaceId’)

WORKSPACE_URL=$(aws amp describe-workspace –region $WORKLOAD_REGION –workspace-id $WORKSPACE_ID –query workspace.prometheusEndpoint –output text)

echo “This is the URL for remote_write configuration: $WORKSPACE_URL” 

echo “export WORKSPACE_ID=$WORKSPACE_ID” >> delete.env

echo “export WORKLOAD_REGION=$WORKLOAD_REGION” >> delete.env

echo “export WORKSPACE_URL=$WORKSPACE_URL” >> delete.env

Cuối cùng chạy lệnh này để in thông tin cần thiết về workload của bạn. Các environment variables này sẽ cần thiết để định cấu hình quy trình xác thực bên ngoài được sử dụng cho IAM Roles Anywhere. Sao chép tất cả các dòng bắt đầu bằng xuất và dán chúng vào thiết bị đầu cuối workload từ xa của bạn.

echo “===== Copy these values to your remote workload ====”

echo -e “\n\nexport TA_ARN=$TA_ARN\nexport PROFILE_ID_ARN=$PROFILE_ID_ARN\nexport REMOTE_ROLE=$REMOTE_ROLE\nexport WORKSPACE_URL=$WORKSPACE_URL”

Định cấu hình workload từ xa của bạn

Lưu ý: Các lệnh sau phải được thực thi trong remote machine nơi workload đang chạy.

6. Cài đặt Prometheus Node Exporter (Optional)

Prometheus Node Exporter hiển thị nhiều chỉ số liên quan đến hardware- và kernel-. Đây là một bước tùy chọn, nhưng nó sẽ hiển thị nhiều số liệu hơn từ máy chủ lưu trữ đến người thu thập và giúp hiểu được tiềm năng của giải pháp được đề xuất trong blog này.

Chúng tôi có thể cài đặt gói này bằng trình quản lý gói Ubuntu:

sudo apt install prometheus-node-exporter -y

7. Sử dụng AWS Distro for Open Telemetry (ADOT) Collector

AWS Distro for OpenTelemetry Collector ((ADOT Collector) là phiên bản được AWS hỗ trợ của OpenTelemetry Collector và được phân phối bởi Amazon. Nó hỗ trợ một số thành phần được chọn từ cộng đồng OpenTelemetry. Nó hoàn toàn tương thích với các nền tảng điện toán AWS bao gồm Amazon EC2, Amazon ECS và Amazon EKS. Dịch vụ này cho phép người dùng gửi dữ liệu đo từ xa tới AWS CloudWatch Metrics và Traces tới AWS X-Ray cũng như các chương trình phụ trợ được hỗ trợ khác như Prometheus.

Trong phần này, chúng tôi sẽ chỉ cho bạn cách bạn có thể triển khai trình thu thập ADOT để thu thập số liệu và gửi các số liệu đó đến Amazon Manage Prometheus workspace của chúng tôi.

Hãy bắt đầu bằng cách tải xuống và cài đặt phiên bản mới nhất của aws-otel-collector Chạy các lệnh sau để làm như vậy:

mkdir /tmp/adot

cd /tmp/adot

wget https://aws-otel-collector.s3.amazonaws.com/ubuntu/amd64/latest/aws-otel-collector.deb

sudo dpkg -i -E ./aws-otel-collector.deb

Người dùng mặc định của trình thu thập ADOT là aoc và nó được tạo như một phần của quá trình cài đặt gói. Chúng tôi cần thực hiện các thay đổi trong tệp cấu hình AWS SDK for Go để người dùng này có thể đảm nhận một vai trò bằng cách sử dụng IAM Roles Anywhere. Để làm như vậy, hãy tạo một thư mục để lưu trữ x509 Certificates và các tệp cấu hình thích hợp.

Bash

sudo mkdir /home/aoc

sudo chown -R aoc:aoc /home/aoc/

ADOT sẽ được định cấu hình để sử dụng sigv4authextension nhằm kết nối với Amazon Managed Service cho Promethues. Tiện ích mở rộng xác thực Sigv4 cung cấp khả năng xác thực Sigv4 để thực hiện các yêu cầu đối với dịch vụ AWS. Nó thêm thông tin xác thực vào các yêu cầu API AWS được gửi bởi HTTP. Thông tin xác thực này được thêm vào bằng cách ký các yêu cầu này bằng thông tin xác thực AWS của bạn.

Đổi lại, sigv4authextension sử dụng AWS SDK for Go để lấy Thông tin xác thực AWS và thông tin đăng nhập được sử dụng để ký lệnh gọi API bằng quy trình sigv4.

Lưu ý: Cách tiếp cận tương tự có thể được sử dụng cho Prometheus Server hoặc Grafana Agent bằng cách định cấu hình người dùng tương ứng, nhưng nó nằm ngoài phạm vi của bài đăng trên blog này.

8. cài đặt AWS Signing helper

Để có được thông tin đăng nhập bảo mật tạm thời từ AWS Identity and Access Management Roles Anywhere, hãy sử dụng công cụ trợ giúp thông tin đăng nhập mà IAM Roles Anywhere cung cấp. Công cụ này tương thích với tính năng credential_process có sẵn trên các ngôn ngữ SDKs. Trình trợ giúp quản lý quá trình tạo chữ ký với certificate và gọi endpoint để lấy thông tin đăng nhập phiên; nó trả về thông tin đăng nhập cho quá trình gọi ở định dạng JSON tiêu chuẩn. Công cụ này là mã nguồn mở và có sẵn trên GitHub.

Sử dụng các lệnh sau để tải xuống và cài đặt công cụ:

wget https://rolesanywhere.amazonaws.com/releases/1.0.3/X86_64/Linux/aws_signing_helper

chmod +x aws_signing_helper

sudo mv aws_signing_helper /usr/bin

9. Tạo key pair và Certificate Request trên Host

Sử dụng các lệnh sau để tạo RSA key pair rồi sử dụng nó để tạo Certificate request cho máy chủ. Lưu ý rằng trong tệp cấu hình, chúng tôi đang đặt Common Name (CN) thành VM01 để phù hợp với điều kiện trong chính sách tin cậy của chúng tôi.

cat > config.txt << EOF

FQDN = vm01.example.com

ORGNAME = Example Corp

[ req ]

default_bits = 2048

default_md = sha256

prompt = no

encrypt_key = no

distinguished_name = dn

req_extensions = v3_req

[ dn ]

C = US

O = Example Corp

CN = VM01

[ v3_req ]

basicConstraints = CA:FALSE

keyUsage = nonRepudiation, digitalSignature, keyEncipherment

extendedKeyUsage = clientAuth,serverAuth

EOF

openssl req -out csr.pem -config config.txt -new -newkey rsa:2048 -nodes -keyout private-key.pem

cat csr.pem

10(a). Tạo x509 Certificate cho workload của bạn

Lưu ý: Các lệnh sau phải được thực thi bởi người dùng có đặc quyền cao trên AWS Account của bạn. Bạn có thể chạy chúng bằng CloudShell.

Sử dụng AWS Private CA để tạo một certificate cho workload

Lệnh trước sẽ in nội dung của Certificate request, tương tự như sau:

—–BEGIN CERTIFICATE REQUEST—–

MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC

VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6

b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd

BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN

MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD

VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z

b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt

YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ

21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T

rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE

Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4

nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb

FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb

NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=

—–END CERTIFICATE REQUEST—–

Sao chép certificated request trên workload terminal và lưu nó vào một local file trong CloudShell hoặc terminal session nơi bạn đã định cấu hình vai trò AWS Private CA và IAM. Đặt tên cho tệp csr.pem để làm cho nó nhất quán với tên tệp gốc.

Sử dụng các lệnh sau để yêu cầu AWS Private CA cấp certificate cho workload của bạn bằng tệp yêu cầu. Lệnh thứ hai sẽ truy xuất certificate đã cấp. Certificate này phải được sao chép trở lại máy xử lý workload của bạn.

WORKLOAD_CERT=$(aws acm-pca issue-certificate \

      –certificate-authority-arn $PRIVATE_CA_ARN \

     –csr fileb://csr.pem \

     –signing-algorithm “SHA256WITHRSA” \

     –validity Value=200,Type=”DAYS” \

     –query CertificateArn \

     –output text)

aws acm-pca get-certificate \

     –certificate-authority-arn $PRIVATE_CA_ARN \

     –certificate-arn $WORKLOAD_CERT \

     –query Certificate \

     –output text > cert.pem

cat cert.pem


Định cấu hình remote workload của bạn

Lưu ý: Các lệnh sau phải được thực thi trong remote machine nơi workload đang chạy.

10(b). Cài đặt key và certificate cho aoc user

Từ lệnh trước sẽ in nội dung của Certificate do AWS Private CA cấp, tương tự như sau:

—–BEGIN CERTIFICATE—–

MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC

VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6

b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd

BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN

MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD

VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z

b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt

YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ

21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T

rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE

Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4

nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb

FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb

NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=

—–END CERTIFICATE—–

Sao chép đầu ra Certificate từ phiên CloudShell hoặc Terminal vào workload machine của bạn và lưu nó dưới dạng cert.pem trong thư mục hiện tại (/tmp/adott). Chạy các lệnh sau để tạo một thư mục mà người dùng aoc có thể truy cập và sao chép các tệp cần thiết vào đó. Lưu ý rằng tệp certificate request csr.pem không còn cần thiết nữa.

sudo mkdir /home/aoc/.x509

sudo mv private-key.pem /home/aoc/.x509/

sudo mv cert.pem /home/aoc/.x509/

sudo chown -R aoc:aoc /home/aoc/.x509/

11. Định cấu hình quy trình xác thực cho aoc user

Private key RSA và certificate được cấp bởi AWS Private CA được sao chép ở trên sẽ được người dùng aoc sử dụng để nhận AWS Identity với sự trợ giúp của công cụ trợ giúp ký được cài đặt ở bước 8. Để thực hiện điều này, chúng ta cần thêm một quy trình bên ngoài vào chuỗi xác thực của AWS SDK cho Go. Chúng tôi có thể làm điều này bằng cách tạo một tệp cấu hình như được giải thích trong tài liệu.

Sử dụng các lệnh sau để tạo tệp cấu hình cần thiết. Hãy nhớ thiết lập các biến môi trường trong môi trường cục bộ bằng cách sao chép các dòng bắt đầu bằng xuất từ AWS Environment của bạn.

cat > config << EOF

[default]

credential_process = aws_signing_helper credential-process –certificate /home/aoc/.x509/cert.pem –private-key /home/aoc/.x509/private-key.pem –trust-anchor-arn $TA_ARN –profile-arn $PROFILE_ID_ARN –role-arn $REMOTE_ROLE

EOF

sudo chown aoc:aoc config

sudo mv config /home/aoc/.x509/

echo “AWS_CONFIG_FILE=/home/aoc/.x509/config” | sudo tee -a /opt/aws/aws-otel-collector/etc/.env

Lưu ý: Quy trình xác thực ở đây được định cấu hình cho profile `default` của cấu hình AWS for Go. Bạn có thể tạo nhiều profiles trong cấu hình của mình nếu cần như được mô tả trong AWS Documentation và bạn có thể chỉ định profiles sẽ được ADOT Collector sử dụng khi thêm biến môi trường AWS_PROFILE và chỉ định tên của profiles trong tệp .env được mô tả ở trên ngoài biến AWS_CONFIG_FILE.

Bây giờ, hãy định cấu hình trình thu thập của chúng ta để gửi chỉ số đến Amazon Managed Service cho Prometheus workspace trong khi định cấu hình role mà chúng ta đã tạo để gửi các chỉ số đó. Người dùng aoc phải truy cập được tệp cấu hình và chúng tôi cần lưu trữ tệp trong đường dẫn cấu hình. Cập nhật tệp cấu hình nếu bạn đã triển khai Amazon Manage Service for Prometheus workspace trên một khu vực khác với us-east-1.

cat > config.yaml << EOF

extensions:

  health_check:

  sigv4auth:

    service: “aps”

    region: “us-east-1”

receivers:

  otlp:

    protocols:

      grpc:

        endpoint: 0.0.0.0:4317

      http:

        endpoint: 0.0.0.0:55681

  prometheus:

    config:

      scrape_configs:

        – job_name: “otel-collector”

          scrape_interval: 5s

          static_configs:

            – targets: [“localhost:8888”]

        – job_name: “node-exporter”

          scrape_interval: 5s

          static_configs:

            – targets: [“localhost:9100”]

processors:

  batch/traces:

    timeout: 1s

    send_batch_size: 50

  batch/metrics:

    timeout: 60s

exporters:

  prometheusremotewrite:

    endpoint: ${WORKSPACE_URL}api/v1/remote_write

    auth:

      authenticator: sigv4auth

service:

  pipelines:

    metrics:

      receivers: [prometheus]

      processors: [batch/metrics]

      exporters: [prometheusremotewrite]

  extensions: [health_check,sigv4auth]

EOF

sudo chown aoc:aoc config.yaml

sudo mv config.yaml /opt/aws/aws-otel-collector/etc/

Cuối cùng, hãy khởi động lại AWS Distro cho bộ sưu tập Open Telemetry để sử dụng cấu hình và thông tin xác thực mới:

sudo systemctl daemon-reload

sudo service aws-otel-collector restart

Bạn có thể xem nếu có bất kỳ lỗi xác thực nào bằng cách sử dụng tạp chí này

sudo journalctl -u aws-otel-collector

Phiên AWS IAM Roles Anywhere được ghi lại trong AWS CloudTrail với tên sự kiện CreateSession từ nguồn sự kiện rolesanywhere.amazonaws.com. Bạn có thể xác định remote machine đang xác thực bằng cách xem thông tin x509 trong phản hồi sự kiện:

{

    “eventVersion”: “1.08”,

    “userIdentity”: {

        “type”: “Unknown”,

        “principalId”: “”,

        “arn”: “”,

        “accountId”: “111122223333”,

        “accessKeyId”: “”,

        “userName”: “”

    },

    “eventTime”: “2022-12-07T01:59:18Z”,

    “eventSource”: “rolesanywhere.amazonaws.com”,

    “eventName”: “CreateSession”,

    “awsRegion”: “us-east-1”,

    “sourceIPAddress”: “*******”,

    “userAgent”: “CredHelper/1.0.3 (go1.16.15; linux; amd64)”,

    “requestParameters”: {

        “cert”: “**** REDACTED ****”,

        “durationSeconds”: 3600,

        “profileArn”: “arn:aws:rolesanywhere:us-east-1:111122223333:profile/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 “,

        “roleArn”: “arn:aws:iam::111122223333:role/ExternalPrometheusRemoteWrite”,

        “trustAnchorArn”: “arn:aws:rolesanywhere:us-east-1:111122223333:trust-anchor/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 “

    },

    “responseElements”: {

        “credentialSet”: [

            {

                “assumedRoleUser”: {

                    “arn”: “arn:aws:sts::111122223333:assumed-role/ExternalPrometheusRemoteWrite/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 “,

                    “assumedRoleId”: “**** REDACTED ****”

                },

                “credentials”: {

                    “accessKeyId”: “**** REDACTED ****”,

                    “expiration”: “2022-12-07T02:59:18Z”,

                    “secretAccessKey”: “HIDDEN_DUE_TO_SECURITY_REASONS”,

                    “sessionToken”: “**** REDACTED ****”

                },

                “packedPolicySize”: 44,

                “roleArn”: “arn:aws:iam::111122223333:role/ExternalPrometheusRemoteWrite”,

                “sourceIdentity”: “CN=VM01”

            }

        ],

        “subjectArn”: “arn:aws:rolesanywhere:us-east-1:111122223333:subject/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111”,

        “x509Subject”: “C=US,O=Example Corp,CN=VM01”

    },

    “requestID”: “f4d2454d-224a-405a-a6a8-28ba9827484f”,

    “eventID”: “6dc838a9-5ca1-4691-8bf3-b55aaec21a48”,

    “readOnly”: false,

    “eventType”: “AwsApiCall”,

    “managementEvent”: true,

    “recipientAccountId”: “111122223333”,

    “eventCategory”: “Management”,

    “tlsDetails”: {

        “tlsVersion”: “TLSv1.2”,

        “cipherSuite”: “ECDHE-RSA-AES128-GCM-SHA256”,

        “clientProvidedHostHeader”: “rolesanywhere.us-east-1.amazonaws.com”

    }

Sử dụng AWS CloudTrail Lake, bạn có thể xác minh tần suất luân phiên thông tin xác thực tạm thời (1 giờ theo mặc định). Sử dụng truy vấn sau để xem các đối số có liên quan được sử dụng trong blog này. Hãy nhớ cập nhật biến $EDS_ID với id của Event Data Sourcecủa bạn:

SELECT 

    eventTime,

    eventName,

    sourceIPAddress,

    userAgent,

    element_at(requestParameters,’profileArn’) as profileArn,

    element_at(requestParameters,’roleArn’) as roleArn,

    element_at(requestParameters,’durationSeconds’) as durationSeconds,

    element_at(requestParameters,’trustAnchorArn’) as trustAnchorArn,

    element_at(responseElements,’x509Subject’) as x509Subject

from 

$EDS_ID 

where 

eventname = ‘CreateSession’ and 

    eventSource = ‘rolesanywhere.amazonaws.com’

Bạn có thể thấy từ kết quả quy trình trợ giúp thông tin xác thực được gọi khoảng 1 giờ một lần (thời lượng phiên) để lấy một bộ thông tin xác thực mới.

Hình 5. Credential Helper Session Trail

AWS IAM Roles Anywhere cũng hiển thị CloudWatch Metrics để theo dõi các lệnh gọi thành công của hành động CreateSession. Bạn có thể xem chỉ số này trong bảng điều khiển chỉ số AWS CloudWatch và tạo cảnh báo để theo dõi vòng quay của thông tin xác thực tạm thời.

Hình 6. Session Count cho IAM Roles Anywhere

Giờ đây, bạn có thể trực quan hóa các số liệu do Node Exporter hiển thị và được ADOT Collector gửi tới Amazon Managed Service cho Prometheus workspace bằng cách sử dụng Amazon Manage Grafana hoặc bất kỳ công cụ trực quan nào khác mà bạn chọn.

Hình 7. Amazon Managed Service cho Grafana dashboard

Xử lý sự cố

  • Xác nhận quyền POSIX trên các tệp được chuyển đến thư mục /home/aoc/.x509/. Các tệp phải được người dùng aoc đọc được
  • Kiểm tra nội dung của tệp cấu hình được sử dụng cho quy trình xác thực (/home/aoc/.x509/config). Trong tệp cấu hình, bạn sẽ thấy ba  Amazon Resource Names  (ARN) khác nhau:
    • Một cho Trust Anchor
    • Một cho Profile
    • Một cho IAM role mà quy trình sẽ đảm nhận.
  • Kiểm tra xem cấu hình của tệp môi trường ADOT Collector trong /opt/aws/aws-otel-collector/etc/.env bao gồm biến môi trường AWS_CONFIG_FILE và nó trỏ đến đúng đường dẫn tệp/home/aoc/.x509/config
  • Kiểm tra tệp cấu hình cho ADOT Collector trong /opt/aws/aws-otel-collector/etc/config.yamlvà xác nhận value endpoint cho trình xuất prometheusremotewrite tương ứng với URL remote_write của Amazon Managed Service for Prometheus workspace của bạn và bao gồm api/v1/remote_write như một phần của URL.

Kết luận

Trong blog này, chúng tôi đã hướng dẫn bạn cách thiết lập môi trường an toàn để thu thập số liệu Prometheus từ máy ảo tại chỗ và ghi số liệu từ xa vào Amazon Managed Services for Prometheus. AWS IAM Roles Anywhere đóng vai trò chính ở đây bằng cách cung cấp thông tin xác thực tạm thời cho máy chủ Prometheus. Như bạn có thể đã biết, bạn có thể dễ dàng thu thập số liệu Prometheus từ nhiều môi trường khác nhau bao gồm các phiên bản Amazon EKS, Amazon ECS và Amazon EC2. Hãy xem các tài liệu tham khảo dưới đây:

Cleanup

Để dọn sạch tài nguyên AWS Environment của bạn, hãy chạy các lệnh sau. Một số thao tác dọn dẹp cũng sẽ cần thiết trên máy ảo của bạn nhưng nằm ngoài phạm vi của các hướng dẫn này.

source delete.env

aws rolesanywhere delete-profile –profile-id $PROFILE_ID

aws rolesanywhere delete-trust-anchor –trust-anchor-id $TA_ID

aws acm-pca update-certificate-authority –certificate-authority-arn $PRIVATE_CA_ARN –status DISABLED

aws acm-pca delete-certificate-authority –certificate-authority-arn $PRIVATE_CA_ARN –permanent-deletion-time-in-days 7

aws iam detach-role-policy –role-name ExternalPrometheusRemoteWrite –policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess

aws iam delete-role –role-name ExternalPrometheusRemoteWrite

aws amp delete-workspace –workspace-id $WORKSPACE_ID –region $WORKLOAD_REGION

Bài được dịch từ bài viết trên AWS Blogs, bạn có thể xem bài viết gốc tại đây.