
أداة لإدارة الأسرار، التشفير كخدمة، وإدارة الوصول المميز
ملاحظة: نحن نأخذ أمان Vault وثقة مستخدمينا على محمل الجد. إذا كنت تعتقد أنك وجدت مشكلة أمنية في Vault، فالرجاء الإبلاغ عنها بمسؤولية عن طريق الاتصال بنا على [email protected].
Vault هي أداة للوصول الآمن إلى الأسرار. السر هو أي شيء تريد التحكم بإحكام في الوصول إليه، مثل مفاتيح API، كلمات المرور، الشهادات، والمزيد. توفر Vault واجهة موحدة لأي سر، مع توفير تحكم دقيق في الوصول وتسجيل سجل تدقيق مفصل.
يتطلب النظام الحديث الوصول إلى مجموعة كبيرة من الأسرار: بيانات اعتماد قاعدة البيانات، مفاتيح API للخدمات الخارجية، بيانات اعتماد الاتصال بالهندسة المعمارية القائمة على الخدمات، إلخ. فهم من يصل إلى أي أسرار هو بالفعل صعب للغاية ومخصص للمنصة. إضافة التدوير الآمن للمفاتيح، التخزين الآمن، وسجلات التدقيق التفصيلية يكاد يكون مستحيلاً بدون حل مخصص. هذا هو المكان الذي تتدخل فيه Vault.
الميزات الرئيسية لـ Vault هي:
تخزين آمن للأسرار: يمكن لـ Vault تخزين أزواج مفتاح/قيمة عشوائية. يقوم Vault بتشفير البيانات قبل كتابتها إلى التخزين الدائم، لذا فإن الوصول إلى التخزين الخام لا يكفي للوصول إلى أسرارك. يمكن لـ Vault الكتابة إلى القرص، Consul، والمزيد.
الأسرار الديناميكية: يمكن لـ Vault إنشاء أسرار عند الطلب لبعض الأنظمة، مثل AWS أو قواعد بيانات SQL. على سبيل المثال، عندما يحتاج تطبيق إلى الوصول إلى دلو S3، فإنه يطلب من Vault بيانات الاعتماد، وسيقوم Vault بإنشاء زوج مفاتيح AWS بأذونات صالحة عند الطلب. بعد إنشاء هذه الأسرار الديناميكية، ستقوم Vault أيضًا بإبطالها تلقائيًا بعد انتهاء مدة الإيجار.
تشفير البيانات: يمكن لـ Vault تشفير وفك تشفير البيانات دون تخزينها. يسمح هذا لفرق الأمان بتحديد معلمات التشفير ويسمح للمطورين بتخزين البيانات المشفرة في موقع مثل قاعدة بيانات SQL دون الحاجة إلى تصميم طرق التشفير الخاصة بهم.
الإيجار والتجديد: يربط Vault إيجارًا بكل سر. في نهاية الإيجار، يقوم Vault تلقائيًا بإبطال السر. يمكن للعملاء تجديد الإيجارات عبر واجهات برمجة التطبيقات المدمجة للتجديد.
الإبطال: يتمتع Vault بدعم مدمج لإبطال الأسرار. يمكن لـ Vault إبطال ليس فقط الأسرار الفردية، بل شجرة من الأسرار، على سبيل المثال، جميع الأسرار التي قرأها مستخدم معين، أو جميع الأسرار من نوع معين. يساعد الإبطال في تدوير المفاتيح وكذلك في تأمين الأنظمة في حالة حدوث اقتحام.
الوثائق متاحة على موقع Vault.
إذا كنت جديدًا في Vault وتريد البدء في أتمتة الأمان، فيرجى الاطلاع على أدلة البدء على منصة HashiCorp التعليمية. هناك أيضًا أدلة إضافية لمواصلة تعلمك.
للحصول على أمثلة حول كيفية التفاعل مع Vault من داخل تطبيقك بلغات برمجة مختلفة، راجع مستودع vault-examples. يتوفر أيضًا تطبيق نموذجي جاهز.
أظهر معرفتك بـ Vault من خلال اجتياز امتحان الشهادة. قم بزيارة صفحة الشهادة للحصول على معلومات حول الامتحانات واعثر على مواد الدراسة على منصة HashiCorp التعليمية.
إذا كنت ترغب في العمل على Vault نفسه أو أي من أنظمته المدمجة، فستحتاج أولاً إلى تثبيت Go على جهازك.
للتطوير المحلي، تأكد أولاً من تثبيت Go بشكل صحيح، بما في ذلك إعداد GOPATH، ثم تعيين متغير GOBIN إلى $GOPATH/bin. تأكد من أن $GOPATH/bin موجود في مسارك، حيث أن بعض التوزيعات تأتي مع إصدار قديم من أدوات البناء.
بعد ذلك، قم باستنساخ هذا المستودع. يستخدم Vault Go Modules، لذا يُنصح باستنساخ المستودع خارج GOPATH. يمكنك بعد ذلك تنزيل أي أدوات بناء مطلوبة عن طريق تهيئة بيئتك:
$ make bootstrap
...
لتجميع إصدار تطويري من Vault، قم بتشغيل make أو make dev. سيضع هذا الملف الثنائي لـ Vault في مجلدات bin و $GOPATH/bin:
$ make dev
...
$ bin/vault
...
لتجميع إصدار تطويري من Vault مع واجهة المستخدم، قم بتشغيل make static-dist dev-ui. سيضع هذا الملف الثنائي لـ Vault في مجلدات bin و $GOPATH/bin:
$ make static-dist dev-ui
...
$ bin/vault
...
لتشغيل الاختبارات، اكتب make test. ملاحظة: هذا يتطلب تثبيت Docker. إذا خرج هذا برمز خروج 0، فكل شيء يعمل!
$ make test
...
إذا كنت تطور حزمة معينة، يمكنك تشغيل اختبارات لتلك الحزمة فقط عن طريق تحديد متغير TEST. على سبيل المثال أدناه، سيتم تشغيل اختبارات حزمة vault فقط.
$ make test TEST=./vault
...
إذا واجهت خطأ مثل could not read Username for 'https://github.com' قد تحتاج إلى ضبط إعدادات git الخاصة بك هكذا:
$ git config --global --add url."[email protected]:".insteadOf "https://github.com/"
ينشر هذا المستودع مكتبتين يمكن استيرادهما بواسطة مشاريع أخرى:
github.com/hashicorp/vault/api و github.com/hashicorp/vault/sdk.
لاحظ أن هذا المستودع يحتوي أيضًا على Vault (المنتج)، وكما هو الحال مع معظم مشاريع Go، يستخدم Vault Go modules لإدارة تبعياته. الآلية للقيام بذلك هي ملف go.mod. وكما حدث، فإن وجود ذلك الملف يجعل من الممكن نظريًا استيراد Vault كاعتمادية في مشاريع أخرى. بعض المشاريع الأخرى اتبعت ممارسة القيام بذلك للاستفادة من أدوات الاختبار التي تم تطويرها لاختبار Vault نفسه. هذا ليس، ولم يكن أبدًا، طريقة مدعومة لاستخدام مشروع Vault. من غير المرجح أن نصلح الأخطاء المتعلقة بفشل استيراد github.com/hashicorp/vault في مشروعك.
انظر أيضًا قسم "الاختبارات المستندة إلى Docker" أدناه.
لدى Vault اختبارات قبول شاملة تغطي معظم ميزات طرق الأسرار والمصادقة.
إذا كنت تعمل على ميزة لطريقة سر أو مصادقة وتريد التحقق من أنها تعمل (وأيضًا لم تفسد أي شيء آخر)، نوصي بتشغيل اختبارات القبول.
تحذير: تقوم اختبارات القبول بإنشاء/تدمير/تعديل موارد حقيقية، مما قد يتسبب في تكاليف فعلية في بعض الحالات. في وجود خطأ، من الممكن تقنيًا أن تترك النهايات الخلفية المعطوبة بيانات معلقة. لذلك، يرجى تشغيل اختبارات القبول على مسؤوليتك الخاصة. على الأقل، نوصي بتشغيلها في حساب خاص منفصل لأي نهاية خلفية تختبرها.
لتشغيل اختبارات القبول، قم باستدعاء make testacc:
$ make testacc TEST=./builtin/logical/consul
...
متغير TEST مطلوب، ويجب عليك تحديد المجلد الذي توجد فيه النهاية الخلفية. يُوصى باستخدام متغير TESTARGS لتحديد مورد معين لاختباره، حيث أن اختبار كل شيء مرة واحدة قد يستغرق وقتًا طويلاً جدًا.
تتطلب اختبارات القبول عادةً تعيين متغيرات بيئة أخرى لأشياء مثل مفاتيح الوصول. يجب أن يخطئ الاختبار نفسه باكرًا ويخبرك بما يجب تعيينه، لذا لم يتم توثيقه هنا.
لمزيد من المعلومات حول ميزات Vault Enterprise، قم بزيارة موقع Vault Enterprise.
لقد أنشأنا آلية اختبار تجريبية جديدة مستوحاة من NewTestCluster. مثال على كيفية استخدامها:
import (
"testing"
"github.com/hashicorp/vault/sdk/helper/testcluster/docker"
)
func Test_Something_With_Docker(t *testing.T) {
opts := &docker.DockerClusterOptions{
ImageRepo: "hashicorp/vault", // أو "hashicorp/vault-enterprise"
ImageTag: "latest",
}
cluster := docker.NewTestDockerCluster(t, opts)
client := cluster.Nodes()[0].APIClient()
_, err := client.Logical().Read("sys/storage/raft/configuration")
if err != nil {
t.Fatal(err)
}
}
أو للإصدار Enterprise:
import (
"testing"
"github.com/hashicorp/vault/sdk/helper/testcluster/docker"
)
func Test_Something_With_Docker(t *testing.T) {
opts := &docker.DockerClusterOptions{
ImageRepo: "hashicorp/vault-enterprise",
ImageTag: "latest",
VaultLicense: licenseString, // ليس مسارًا، بل نص الترخيص الفعلي
}
cluster := docker.NewTestDockerCluster(t, opts)
}
إليك مثال أكثر واقعية لكيفية استخدامه في الممارسة. يستخدم DefaultOptions hashicorp/vault:latest كمستودع وعلامة، ولكنه ينظر أيضًا إلى متغير البيئة VAULT_BINARY. إذا كان ممتلئًا، فسينسخ الملف المحلي المشار إليه بواسطة VAULT_BINARY داخل الحاوية. هذا مفيد عند اختبار التغييرات المحلية.
بدلاً من تعيين خيار VaultLicense، يمكنك تعيين متغير البيئة VAULT_LICENSE_CI، وهو أفضل من إيداع ترخيص في نظام التحكم بالإصدارات.
يمكنك اختياريًا تعيين COMMIT_SHA، والذي سيتم إلحاقه باسم الصورة التي نبنيها كتسهيل للتصحيح.
func Test_Custom_Build_With_Docker(t *testing.T) {
opts := docker.DefaultOptions(t)
cluster := docker.NewTestDockerCluster(t, opts)
}
هناك مجموعة متنوعة من المساعدات في حزمة github.com/hashicorp/vault/sdk/helper/testcluster، على سبيل المثال، هذه الاختبارات أدناه ستنشئ زوجًا من مجموعات 3 عقد وتربطهما باستخدام PR أو DR replication على التوالي، وتفشل إذا لم تصبح حالة النسخ المتماثل سليمة قبل انتهاء صلاحية السياق الذي تم تمريره.
مرة أخرى، كما هو مكتوب، هذه تعتمد على وجود ملف ثنائي لـ Vault Enterprise محليًا ومتغير البيئة VAULT_BINARY مضبوطًا للإشارة إليه، بالإضافة إلى تعيين VAULT_LICENSE_CI.
func TestStandardPerfReplication_Docker(t *testing.T) {
opts := docker.DefaultOptions(t)
r, err := docker.NewReplicationSetDocker(t, opts)
if err != nil {
t.Fatal(err)
}
defer r.Cleanup()
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
err = r.StandardPerfReplication(ctx)
if err != nil {
t.Fatal(err)
}
}
func TestStandardDRReplication_Docker(t *testing.T) {
opts := docker.DefaultOptions(t)
r, err := docker.NewReplicationSetDocker(t, opts)
if err != nil {
t.Fatal(err)
}
defer r.Cleanup()
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
err = r.StandardDRReplication(ctx)
if err != nil {
t.Fatal(err)
}
}
أخيرًا، إليك مثال على تشغيل اختبار Docker OSS موجود باستخدام ملف ثنائي مخصص:
$ GOOS=linux make dev
$ VAULT_BINARY=$(pwd)/bin/vault go test -run 'TestRaft_Configuration_Docker' ./vault/external_tests/raft/raft_binary
ok github.com/hashicorp/vault/vault/external_tests/raft/raft_binary 20.960s