Terraform-provider-aws: استرداد بصمة إبهام موفر OIDC التي لم يتم ملؤها وهو مطلوب لحسابات خدمة EKS

تم إنشاؤها على ١٣ سبتمبر ٢٠١٩  ·  39تعليقات  ·  مصدر: hashicorp/terraform-provider-aws

وصف

الموارد الجديدة أو المتأثرة

يمكنني حاليًا تحديد ما يلي:

resource "aws_iam_openid_connect_provider" "cluster" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = []
  url             = aws_eks_cluster.cluster.identity.0.oidc.0.issuer
}

لا توجد طريقة لاسترداد بصمة الإبهام لمزود OIDC باستخدام التضاريس.

لاحظ أنه إذا قمت بإنشاء موفر OIDC نفسه في وحدة التحكم ، فسيقوم تلقائيًا بتعبئة بصمة الإبهام المطلوبة لحسابات خدمة EKS لتولي دور IAM الصحيح.

مراجع

الطريقة الحالية للحصول على بصمة الإبهام موثقة هنا -> https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html#thumbstep2

enhancement serviciam

التعليق الأكثر فائدة

يعمل هذا مع سحابة terraform

#!/bin/bash

THUMBPRINT=$(echo | openssl s_client -servername oidc.eks.${1}.amazonaws.com -showcerts -connect oidc.eks.${1}.amazonaws.com:443 2>&- | tac | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tac | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON


data "external" "thumbprint" {
  program = [format("%s/bin/get_thumbprint.sh", path.module), data.aws_region.current.name]
}

resource "aws_iam_openid_connect_provider" "this" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [data.external.thumbprint.result.thumbprint]
  url             = module.eks.cluster_oidc_issuer_url
}


ال 39 كومينتر

+1

لقد ذهبت من خلال المثال هنا:
https://www.terraform.io/docs/providers/aws/r/eks_cluster.html#enopped -iam-roles-for-service-accounts

حيث يكون thumbprint_list قائمة فارغة. نجح كل شيء حتى حاولت بالفعل إجراء عملية AWS:

An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint

أتمنى حقًا أن تقدم AWS طريقة أسهل للحصول على بصمة الشهادة.

بعد إجراء بعض البحث ، يبدو أن هذا قد يحل مشكلتنا إذا تم تنفيذه:
https://github.com/terraform-providers/terraform-provider-tls/issues/52

في هذه الأثناء ، هناك اختراق سريع للالتفاف حوله ، ليس مثاليًا ولكن تم اختباره

echo | openssl s_client -connect oidc.eks.us-west-2.amazonaws.com:443 2>&- | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}'
locals {
  eks-oidc-thumbprint = "$OUTPUT_FROM_ABOVE"
}

resource "aws_iam_openid_connect_provider" "eks-oidc" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [local.eks-oidc-thumbprint]
  url             = "${aws_eks_cluster.cluster.identity.0.oidc.0.issuer}"
}

هناك طريقة تلقائية تلقيتها من kubernetes slack والتي تستخدم مصدر خارجي:

### External cli kubergrunt
data "external" "thumb" {
  program = ["kubergrunt", "eks", "oidc-thumbprint", "--issuer-url", aws_eks_cluster.cluster.identity.0.oidc.0.issuer]
}
### OIDC config
resource "aws_iam_openid_connect_provider" "cluster" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [data.external.thumb.result.thumbprint]
  url             = aws_eks_cluster.cluster.identity.0.oidc.0.issuer
}

أنا شخصياً أعتقد أن هذا الشيء بصمة الإبهام يجب أن يعيش في إعادة توزيع موارد التضاريس.
عادة ما تكون بصمة إصبع SHA1 في شكل

SHA1 Fingerprint=63:96:61:30:76:16:08:20:97:18:C5:04:5C:FF:B4:85:6F:B5:39:76

لكن aws_iam_openid_connect_provider يحتاج إلى أن يكون مثل (نعم بأحرف صغيرة)


لا أعرف ما إذا كان هذا التحويل المحدد عامًا بما يكفي للعيش في مزود Terraform TLS.

على أي شخص يفضل عدم تثبيت kubergrunt، ودمج كل من @ zzh8829 وmarcincuber الحل لجعل terraform تلقائيا استرداد بصمة الإبهام من البرنامج النصي الخارجي.

بصمة الإبهام

#!/bin/bash

THUMBPRINT=$(echo | openssl s_client -connect oidc.eks.$1.amazonaws.com:443 2>&- | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON

terraform.tf

data "external" "thumbprint" {
  program = ["thumbprint.sh", data.aws_region.current.name]
}

resource "aws_iam_openid_connect_provider" "this" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [data.external.thumbprint.result.thumbprint]
  url             = "${aws_eks_cluster.this.identity.0.oidc.0.issuer}"
}

dogzzdogzz شكرا على الحل الخاص بك! لسوء الحظ حاولت ذلك دون أي حظ. إنه يعطيني بصمة إبهام غير صحيحة.

من خلال فهمي للبرنامج التعليمي لـ aws ، نحتاج إلى استخراج الشهادة الأخيرة فقط بين BEGIN CERTIFICATE و END CERTIFICATE ، تلك الشهادة هي شهادة الجذر CA.

ثم يمكننا إعطائها لـ openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}' لاستخراج بصمة الإبهام

نعم ، ينتج عن ذلك بصمة إبهام لا تعمل. إليكم رسالتي الرهيبة لإنتاج بصمة إبهام عاملة:
echo | openssl s_client -servername oidc.eks.${REGION}.amazonaws.com -showcerts -connect oidc.eks.${REGION}.amazonaws.com:443 2>&- | tail -r | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tail -r | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}'

تحرير: هذا خاص بـ OSX ، بالنسبة لـ GNU / Linux استبدل tail -r بـ tac

شكرا! لقد جمعت بين الحلين للحصول على مورد صالح للعمل

لذا لا تعمل الحلول المذكورة أعلاه مع الإعداد لدينا ، فنحن نستخدم بروكسي https ، وبالتالي لن تكون سلسلة CA صحيحة إذا مررت بذلك. يمكنني حفر نفق من خلال حصن ، لكن هل أفتقد شيئًا هنا ، سيكون جذر المرجع المصدق هذا ثابتًا في الغالب لكل منطقة من مناطق AWS ، أليس كذلك؟ ألن يكون من الممكن الاحتفاظ ببصمات الأصابع لكل منطقة في خريطة TF حتى يتم تقديم حل أفضل؟

chiefy ، لا تحتاج حتى إلى خريطة - يبدو أن المرجع المصدق الجذر هو نفسه بالنسبة للمنطقتين اللتين

يجب أن يكفي تعيين بصمات الأصابع على ["9E99A48A9960B14926BB7F3B02E22DA2B0AB7280"] :)

willthames شكرا لتأكيد صحة عقلي.

بالنسبة لأي شخص يواجه مشكلات تتعلق باختلاف بصمات الأصابع أو عدم تناسقها ، فقد يساعد ذلك ...

~ عند تشغيل openssl s_client -servername oidc.eks.${REGION}.amazonaws.com وما إلى ذلك من "داخل" الكتلة (من أحد عمال EKS لديك) ، تحصل على شهادة مثل: ~
عند تشغيل openssl s_client -servername oidc.eks.${REGION}.amazonaws.com وما إلى ذلك من "داخل" الكبسولة ، تحصل على شهادة مثل:

subject=CN = oidc.eks.us-west-2.amazonaws.com
issuer=C = US, O = Amazon, OU = Server CA 1B, CN = Amazon

☝️ هذه هي بصمة الإبهام التي تريدها.

ولكن ، إذا كنت تقوم بهذه العملية نفسها من خارج الكتلة ، فمن المحتمل أن تتلقى شيئًا مثل:

subject=/CN=*.execute-api.us-west-2.amazonaws.com
issuer=/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon

HTH

dayglojesus نعم ، إنه يساعد ، لكن لا تزال هناك مشكلة في أتمتة هذا. إذا احتجنا إلى تشغيل الأمر من داخل Pod للحصول على بصمة الإبهام المطلوبة لأتمتة سياسات دور IAM لـ ServiceAccounts ، فإنه يجعل من المستحيل العمل: - /
على الرغم من ذلك ، نظرًا لأنه يحل مشكلتي ، لم يعمل البرنامج النصي الذي أنشأ بصمة الإبهام واضطر إلى العثور عليه بطريقة أخرى. وهو أكثر تسلية ، هناك أكثر من شهادة واحدة ، على وجه الدقة 4 منهم ومع هذه القائمة نجحت في العمل.

Grejeru أوافق ، لا ينبغي أن يكون هذا مطلبًا صعبًا ، ولكن وفقًا لتعليقاتchiefy ... يجب أن تكون قادرًا على إنشاء map من الإبهام الصحيح ، واحد لكل منطقة مطلوبة.

يجب أن يكفي تعيين بصمات الأصابع على ["9E99A48A9960B14926BB7F3B02E22DA2B0AB7280"] :)

@ Willthames حسنًا ، سيؤدي هذا إلى انجراف مستمر لأن بصمة الإبهام يجب أن تكون صغيرة (على الأقل هذه هي تجربتي).
ومع ذلك ، فإن جميع مناطق الاتحاد الأوروبي لديها نفس بصمة الإبهام. لقد جربت البرنامج النصي من خارج VPC وكذلك من Gitlab runner في EKS وحصلت على نفس النتائج / بصمة الإبهام.

لقد قمت بدمج الأسطر المفردة القبيحة السابقة مع الاقتراحات هنا وقدمت هذا (لـ tf v.0.11.x):

<module_name>/bin/get_thumbprint.sh

#!/bin/bash
set -e 

XR="${1:-eu-west-1}"
XT=`mktemp`
XXT=`mktemp`

function cleanup {
  rm -f ${XT} ${XXT}
}

trap cleanup SIGHUP SIGINT SIGTERM EXIT

THUMBPRINT=$(echo QUIT | openssl s_client -showcerts -connect oidc.eks.${XR}.amazonaws.com:443 2>/dev/null > ${XT}; cat ${XT} | sed -n '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' | tac | awk '/-----BEGIN CERTIFICATE-----/ {exit} 1' > ${XXT} && echo '-----BEGIN CERTIFICATE-----' >> ${XXT} && tac ${XXT} > ${XT}; openssl x509 -in ${XT} -fingerprint -noout | sed -r 's|.*+?=(.*)|\1|g' | sed 's|:||g' | awk '{print tolower($1)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON

<module_name>/data.tf

data "aws_region" "current" {}
data "external" "thumbprint" {
  program = ["${path.module}/bin/get_thumbprint.sh", "${data.aws_region.current.name}"]
}

<module_name>/main.tf

resource "aws_iam_openid_connect_provider" "cluster" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = ["${data.external.thumbprint.result.thumbprint}"]
  url             = "${data.aws_eks_cluster.this.identity.0.oidc.0.issuer}"
}

يبدو أن هذا يعمل بشكل جيد مع حساب الخدمة kube-system aws-node . على الأقل بقدر ما أستطيع أن أقول بعد يومين ....

rastakajakwanna نعم ، أنت محق تمامًا ، أعتقد أنني كتبت تعليقي بعد أن أدركت أنه

لكنني حرفياً أقوم بترميز القيمة (الصغيرة) إلى متغير. لا أرى فائدة من قيام terraform بتشغيل برنامج نصي لتوليد قيمة متسقة حتى الآن عبر جميع المناطق ، ونظرًا لكونها الجذر CA ، فمن المحتمل أن تظل كذلك لمدة عقد.

يعمل هذا مع سحابة terraform

#!/bin/bash

THUMBPRINT=$(echo | openssl s_client -servername oidc.eks.${1}.amazonaws.com -showcerts -connect oidc.eks.${1}.amazonaws.com:443 2>&- | tac | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tac | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON


data "external" "thumbprint" {
  program = [format("%s/bin/get_thumbprint.sh", path.module), data.aws_region.current.name]
}

resource "aws_iam_openid_connect_provider" "this" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [data.external.thumbprint.result.thumbprint]
  url             = module.eks.cluster_oidc_issuer_url
}


هل يجب وضع علامة على هذه المشكلة على أنها خطأ؟ وثائق موفر التضاريس مضللة ، حيث لا يسمح thumbprint الفارغ باستخدام EKS IAM مع حساب الخدمة.

jujugrrr لا أعتقد أن هذا خطأ. يفتقد Terraform ببساطة طريقة لاسترداد بصمة الإبهام. أنا أوافق على أن الوثائق ليست مثالية.

jujugrrr لا أعتقد أن هذا خطأ. يفتقد Terraform ببساطة طريقة لاسترداد بصمة الإبهام. أنا أوافق على أن الوثائق ليست مثالية.

عادل بما فيه الكفاية 😄 ، لقد قمت بتطويره مع AWS ، لكن يبدو أنه سلوك عاقل عدم كشف بصمة الإبهام من خلال استجابة واجهة برمجة التطبيقات من جانبهم ، وهذا على الأرجح سبب قيام وحدة تحكم AWS بتعبئتها تلقائيًا للراحة.

دعنا نتبع https://github.com/terraform-providers/terraform-provider-aws/pull/10217

إذا احتاج أي شخص إلى تشغيل مثال mzupan على tac غير متوفر هناك افتراضيًا وتحتاج إما إلى تثبيت coreutils أو استبداله بـ tail -r وهو ما فعلته:

#/bin/bash

THUMBPRINT=$(echo | \
    openssl s_client -servername oidc.eks.${1}.amazonaws.com -showcerts -connect oidc.eks.${1}.amazonaws.com:443 2>&- | \
    tail -r | \
    sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | \
    tail -r | \
    openssl x509 -fingerprint -noout | \
    sed 's/://g' | awk -F= '{print tolower($2)}')

THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"

echo $THUMBPRINT_JSON

شكرا mzupan ❤️

~ عند تشغيل openssl s_client -servername oidc.eks.${REGION}.amazonaws.com وما إلى ذلك من "داخل" الكتلة (من أحد عمال EKS لديك) ، تحصل على شهادة مثل: ~
عند تشغيل openssl s_client -servername oidc.eks.${REGION}.amazonaws.com وما إلى ذلك من "داخل" الكبسولة ، تحصل على شهادة مثل:

dayglojesusGrejeru أعتقد أنني وجدت القضية الجذرية للحصول على شهادات مختلفة من العملاء المختلفة:

يعتمد ذلك على تنفيذ / إصدار الأمر openssl . في OpenSSL (منذ 1.1؟) ، سيرسل connect تلقائيًا servername مع الاتصال (إشارة اسم الخادم). انظر [1]

التطبيقات الأخرى مثل LibreSSL (على نظام Mac) أو CodeBuild / AmazonLinux 2 (التي تستخدم OpenSSL 1.0.2 ) لا تقوم تلقائيًا بتعيين servername لذلك يتعين علينا توفيرها.

يجب أن يعمل الأمر التالي بشكل مستقل عن إصدارات OpenSSL / implemenentations:

openssl s_client -connect oidc.eks.eu-central-1.amazonaws.com:443 -servername oidc.eks.eu-central-1.amazonaws.com

[1] https://www.openssl.org/docs/man1.1.1/man1/openssl-s_client.html

تضمين التغريدة

لدي إصدار محدث يختبر نوع env يستخدمه سحابة tf

#!/bin/bash



if [[ -z "${ATLAS_WORKSPACE_SLUG}" ]]; then
  APP="tail -r"
else
  APP="tac"
fi

THUMBPRINT=$(echo | openssl s_client -servername oidc.eks.${1}.amazonaws.com -showcerts -connect oidc.eks.${1}.amazonaws.com:443 2>&- | ${APP} | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | ${APP} | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON

إذا كان سلوك بصمة x509 الخاص بـ opensl الخاص بك افتراضيًا لشيء آخر غير sha1 ، فقد تحصل على بصمات أصابع غير صالحة:

Member must satisfy constraint: [Member must have length less than or equal to 40, Member must have length greater than or equal to 40]

كونك صريحًا يعمل على إصلاح هذا:

#!/bin/sh
# https://github.com/terraform-providers/terraform-provider-aws/issues/10104

THUMBPRINT=$(echo | openssl s_client -servername oidc.eks.${1}.amazonaws.com -showcerts -connect oidc.eks.${1}.amazonaws.com:443 2>&- | tac | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tac | openssl x509 -fingerprint -sha1 -noout | sed 's/://g' | awk -F= '{print tolower($2)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON

يبدو أن بصمة الإبهام هي نفسها cn-northwest-1

echo | openssl s_client -servername oidc.eks.cn-northwest-1.amazonaws.com.cn -showcerts -connect oidc.eks.cn-northwest-1.amazonaws.com.cn:443 2>&- | tail -r | sed -n '/-----END CERTIFICATE-----/,/-----BEGIN CERTIFICATE-----/p; /-----BEGIN CERTIFICATE-----/q' | tail -r | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}'

على أي شخص يفضل عدم تثبيت kubergrunt، ودمج كل من @ zzh8829 وmarcincuber الحل لجعل terraform تلقائيا استرداد بصمة الإبهام من البرنامج النصي الخارجي.

بصمة الإبهام

#!/bin/bash

THUMBPRINT=$(echo | openssl s_client -connect oidc.eks.$1.amazonaws.com:443 2>&- | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print tolower($2)}')
THUMBPRINT_JSON="{\"thumbprint\": \"${THUMBPRINT}\"}"
echo $THUMBPRINT_JSON

terraform.tf

data "external" "thumbprint" {
  program = ["thumbprint.sh", data.aws_region.current.name]
}

resource "aws_iam_openid_connect_provider" "this" {
  client_id_list  = ["sts.amazonaws.com"]
  thumbprint_list = [data.external.thumbprint.result.thumbprint]
  url             = "${aws_eks_cluster.this.identity.0.oidc.0.issuer}"
}

mzupan اضطررت إلى تعديل هذه الإجابة
program = ["${path.module}/thumbprint.sh", var.aws_region]

mzupan اضطررت إلى تعديل هذه الإجابة
program = ["${path.module}/thumbprint.sh", var.aws_region]

يمكنك استخدام data "aws_region" "current" {} في الوحدة أيضًا ، فهي تفترض المنطقة التي يعمل بها مزودك ، ولا تحتاج إلى تمرير aws_region إلى الوحدة النمطية بعد ذلك.

يمكنك إنشاء بصمة الإصبع وتعيينها في thumbprint_list ، اتبع كيفية هذا الرابط: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html

هذه كلها بصمات CA حسب المنطقة:

3ACE16CA6BAE7B16AAE3707096D1DE7D29093AD8
ap-south-1
59ADE3A3A6039BBA092E920FEE413466493F409C
eu-west-3
3FB881BCACBD420928168C739B07EEF47555946B
eu-west-2
7CA6BE9F14E20973CB2C58452DA9B1E2BEB7236B
eu-west-1
CAB073498D7558FEC3B2C414C006ACBA30805431
ap-northeast-2
2EAFC197C15CDEE5426BFD4D27D3321A685F3B78
ap-northeast-1
B715DC079832DA5FC1D4706515BE48BE79A1C871
sa-east-1
CB454452665937052981CA118417B7A162A25F54
ca-central-1
1C8B5245E80A6B7A0E8BF5FFDAB032273D7D5DF1
ap-southeast-1
F719C49FEA86549E159818880E392C1570C953B6
ap-southeast-2
0148872FA02F3A7D6B38AA88FA5397228B28E08B
eu-central-1
9884072430220E6253011B88F940E4F20F53D0CC
us-east-1
598ADECB9A3E6CC70AA53D64BD5EE4704300382A
us-east-2
750B948515281953BC6F3D717A1E1654ECBFA852
us-west-1
89BABC6D46502653516CC0BA38B14A2B7864D161
us-west-2
63966130761608209718C5045CFFB4856FB53976

يمكنك تحديد المتغير الخاص بك مثل هذا:

thumbprint_list = ["3ACE16CA6BAE7B16AAE3707096D1DE7D29093AD8","59ADE3A3A6039BBA092E920FEE413466493F409C","3FB881BCACBD420928168C739B07EEF47555946B","7CA6BE9F14E20973CB2C58452DA9B1E2BEB7236B","CAB073498D7558FEC3B2C414C006ACBA30805431","2EAFC197C15CDEE5426BFD4D27D3321A685F3B78","B715DC079832DA5FC1D4706515BE48BE79A1C871","CB454452665937052981CA118417B7A162A25F54","1C8B5245E80A6B7A0E8BF5FFDAB032273D7D5DF1","F719C49FEA86549E159818880E392C1570C953B6","0148872FA02F3A7D6B38AA88FA5397228B28E08B","9884072430220E6253011B88F940E4F20F53D0CC","598ADECB9A3E6CC70AA53D64BD5EE4704300382A","750B948515281953BC6F3D717A1E1654ECBFA852","89BABC6D46502653516CC0BA38B14A2B7864D161","63966130761608209718C5045CFFB4856FB53976"]

أمر الحصول على بصمة الإصبع:

echo | openssl s_client -servername oidc.eks.${region_name}.amazonaws.com -connect oidc.eks.${region_name}.amazonaws.com:443 2>&- | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print $2}'

romaryoricardo لم mzupan (أو cippaciong لنظام mzupan (سأقوم بإلقاء التخمين بأن شهادات متعددة يتم mzupan هي الأحدث ، وفي حالتك هي الأقدم ، على الرغم من أنني قد أكون مخطئًا تمامًا). هذا لا يعني أن الحلول الخاصة بك لا ينبغي أن تعمل ، ولكن إذا فحصنا شهادة البصمة التي يبصقها الأمر الخاص بك ، يمكننا أن نرى أن هذه الشهادة على وشك الانتهاء (تحقق من الصلاحية ، تنتهي صلاحيتها في سبتمبر 2020):

echo | openssl s_client -servername oidc.eks.${region_name}.amazonaws.com -connect oidc.eks.${region_name}.amazonaws.com:443 2>&- | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | openssl x509 -fingerprint -noout -text

بينما في الآخر ، تنتهي صلاحيتها في عام 2034.
علاوة على ذلك ، قمت بتشغيل البرنامج النصي mzupan لجميع المناطق ، ويبدو أن بصمة الإخراج هي نفسها لجميع المناطق تمامًا (كما يقترح willthames ) ، لذلك في حالتي ، قررنا ببساطة ترميز بصمة الإصبع في وحدة terraform ، على الرغم من لا يزال لدينا الحل البديل علق عليه للرجوع إليه في المستقبل. نحن نعلم أن عناصر الترميز الثابت تمتص ، لكن الحلول المقدمة ليست محمولة جدًا.

بالنسبة لأولئك الذين ليسوا راضين عن الحيل القذرة في نص الشيل: get_thumbprint.sh (على سبيل المثال: tac مرتين).
فيما يلي نص برمجي يعمل بيثون: (تم اختباره باستخدام python3)

import socket
from OpenSSL import SSL
import certifi
import sys, json

hostname = f'oidc.eks.{sys.argv[1]}.amazonaws.com'
port = 443


context = SSL.Context(method=SSL.TLSv1_METHOD)
context.load_verify_locations(cafile=certifi.where())

conn = SSL.Connection(context, socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM))
conn.settimeout(5)
conn.connect((hostname, port))
conn.setblocking(1)
conn.do_handshake()
conn.set_tlsext_host_name(hostname.encode())

thumbprint = conn.get_peer_cert_chain()[-1].digest("sha1")
obj = {"thumbprint": thumbprint.decode("utf-8").replace(":", "").lower() }
print(json.dumps(obj))
conn.close()

بالنسبة لصور عامل إرساء جبال الألب ، يكفي التثبيت:

apk add py3-openssl
pip3 install certifi

للبيثون: 3 صورة عامل إرساء:

pip3 install pyopenssl certifi

https://github.com/terraform-providers/terraform-provider-aws/issues/10104#issuecomment -632309246 اعتاد أن يظهر شهادة أطول تنتهي صلاحيتها في 2034.

نقطة النهاية: oidc.eks.ap-northeast-1.amazonaws.com

{"thumbprint": "9e99a48a9960b14926bb7f3b02e22da2b0ab7280"}

ومع ذلك ، قمت بتشغيل البرنامج النصي نفسه ويعرض شهادة أقصر ، تنتهي صلاحيتها في سبتمبر 2020. (وهو مطابق للشهادة التي تظهر على المتصفح.)

نقطة النهاية: oidc.eks.ap-northeast-1.amazonaws.com

{"thumbprint": "b715dc079832da5fc1d4706515be48be79a1c871"}

سلسلة الشهادات

, CN=oidc.eks.ap-northeast-1.amazonaws.com, B715DC079832DA5FC1D4706515BE48BE79A1C871, 08/09/2020 21:00:00
, CN=Amazon, OU=Server CA 1B, O=Amazon, C=US, 917E732D330F9A12404F73D8BEA36948B929DFFC, 19/10/2025 09:00:00
, CN=Amazon Root CA 1, O=Amazon, C=US, 06B25927C42A721631C1EFD9431E648FA62E1E39, 31/12/2037 10:00:00
, CN=Starfield Services Root Certificate Authority - G2, O="Starfield Technologies, Inc.", L=Scottsdale, S=Arizona, C=US, 9E99A48A9960B14926BB7F3B02E22DA2B0AB7280, 29/06/2034 02:39:16
Starfield Class 2 Certification Authority, OU=Starfield Class 2 Certification Authority, O="Starfield Technologies, Inc.", C=US, AD7E1C28B064EF8F6003402014C3D0E3370EB58A, 30/06/2034 02:39:16

image

guitarrapc هذه قيمة صحيحة B715DC079832DA5FC1D4706515BE48BE79A1C871 . القيمة الأولية لمنطقة مختلفة.
انظر التعليق السابق https://github.com/terraform-providers/terraform-provider-aws/issues/10104#issuecomment -633130751

أشعر أن هذه مشكلة يمكن إغلاقها الآن. هناك العديد من الحلول المقترحة التي من شأنها حل المشاكل مع مزود OIDC.

عوف ، لقد أنشأت للتو مجموعة جديدة اليوم ولديها شهادة جديدة لـ us-west-2 :

$ region_name=us-west-2; echo | openssl s_client -servername oidc.eks.${region_name}.amazonaws.com -connect oidc.eks.${region_name}.amazonaws.com:443 2>&- | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | openssl x509 -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            0f:a2:dc:f6:0e:ff:f7:41:2f:76:c8:3c:e2:71:0d:6f
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Amazon, OU=Server CA 1B, CN=Amazon
        Validity
            Not Before: Jul 10 00:00:00 2020 GMT
            Not After : Aug 10 12:00:00 2021 GMT
$ region_name=us-west-2; echo | openssl s_client -servername oidc.eks.${region_name}.amazonaws.com -connect oidc.eks.${region_name}.amazonaws.com:443 2>&- | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | openssl x509 -fingerprint -noout | sed 's/://g' | awk -F= '{print $2}'

7FF5BDFA36CD78827820278B4DABB5E1E97C1476

nickatsegment أعتقد أن هذا لأنك ارتكبت نفس الخطأ الذي ارتكبته وأنت تستخدم شهادة خادم "Leaf" التي يتم تحديثها نظرًا لانتهاء صلاحيتها القصيرة. بدلاً من ذلك ، استخدم شهادة المرجع المصدق الجذر التي تنتهي صلاحيتها في عام 2034 أو ما شابه ذلك.

قم بالتبديل لاستخدام الأوامر أعلاه التي تحتوي على -showcerts في سطر أوامر openssl لإظهار جميع الشهادات في السلسلة ، ولكن احذر كثيرًا من إجبارك على استخدام أداة مساعدة لإعادة ترتيب الأسطر لاختيار الشهادة الصحيحة ، والتي تتغير اعتمادًا على نظام التشغيل الذي تشغله: tac (Linux) أو tail -r OS / X.

مأخوذة من عدد من المصادر ولكن بمساعدة صريحة من هذه المقالة https://medium.com/@michael.kandelaars/did -your-eks-iam-service-account-features-break-today-2ea50c869aee ، هذا الموضوع & من بالطبع Stackoverflow لـ bash-fu ، لقد حصلت على هذا البرنامج النصي الذي يمسك بصمة إبهام الجذر.

ليس الأجمل ، ولكن يعمل على الشكل الصحيح؟

#!/usr/bin/env bash

echo | openssl s_client -servername oidc.eks.${1}.amazonaws.com -showcerts -connect oidc.eks.${1}.amazonaws.com:443 2>&- | awk '/-----BEGIN/{f="cert."(n++)} f{print>f} /-----END/{f=""}'

certificates=()

for c in cert.*; do
   certificates+=($(openssl x509 <$c -noout -fingerprint))
done
rm cert.* 

thumbprint=$(echo ${certificates[${#certificates[@]}-1]} | sed 's/://g' | awk -F= '{print tolower($2)}')
thumbprint_json="{\"thumbprint\": \"${thumbprint}\"}"
echo $thumbprint_json

./this_script.sh <aws-region-code>

بلدي الخارجي لهذا

خارجي / بصمة الإبهام

#!/bin/bash

set -euo pipefail

HOST="oidc.eks.$1.amazonaws.com"

# https://github.com/terraform-providers/terraform-provider-aws/issues/10104

echo | openssl s_client -servername "$HOST" -showcerts -connect "$HOST:443" 2>&- \
  | sed -n '/-----BEGIN CERTIFICATE-----/h;//!H;$!d;x;s/\(.*-----END CERTIFICATE-----\).*/\1/p' \
  | openssl x509 -fingerprint -sha1 -noout \
  | tr '[:upper:]' '[:lower:]' \
  | sed 's/://g; s/.*=\(.*\)/{"thumbprint": "\1"}/'

استخدمه مثل هذا:

data "external" "thumbprint" {
  program = [
    "/bin/sh",
    "${path.module}/external/thumbprint",
    data.aws_region.current.name,
  ]
}

resource "aws_iam_openid_connect_provider" "this" {
  url = aws_eks_cluster.this.identity[0]["oidc"][0]["issuer"]
  client_id_list = [
    "sts.amazonaws.com",
  ]
  thumbprint_list = [
    data.external.thumbprint.result.thumbprint,
  ]
}

بالنسبة لمنطقة eu-central-1 ، فإنها تُرجع بصمة الإصبع لهذه الشهادة:

Issuer: C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
Validity
    Not Before: Sep  2 00:00:00 2009 GMT
    Not After : Jun 28 17:39:16 2034 GMT
Subject: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2

سأقوم بقفل هذه المشكلة لأنه تم إغلاقه لمدة _30 يومًا_ ⏳. يساعد هذا المشرفين لدينا في العثور على المشكلات النشطة والتركيز عليها.

إذا كنت تشعر أنه يجب إعادة فتح هذه المشكلة ، فنحن نشجع على إنشاء مشكلة جديدة مرتبطة بهذه المشكلة مرة أخرى من أجل سياق إضافي. شكرا!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات