پرش به محتویات

شب ۱۳: TLS، اطلاعات محرمانه و دسترس‌پذیری بالا در Swarm

بخش ۱۳ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثال‌ها مطابق منبع با Traefik Proxy v3.7 نوشته شده‌اند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزموده‌شده یا digest مشخصی را ثابت کنید. تمرین‌ها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.

فهرست کامل دورهٔ ترافیک در ۳۰ شب

هدف‌های یادگیری

  • تحویل داده‌های TLS بدون جاسازی در فایل stack.
  • طراحی هم‌زمان جانمایی نمونه‌ها و انتشار پورت.
  • توضیح ضرورت صدور خارجی گواهی برای دسترس‌پذیری بالای قابل‌اتکا.

تمرین عملی: استفاده از secretها و configهای Swarm

از گواهی‌های آزمایشگاهی شب ۰۶ secret بسازید؛ کلید خصوصی را commit نکنید:

docker secret create whoami_tls_crt certs/whoami.crt
docker secret create whoami_tls_key certs/whoami.key
# tls-dynamic.yml, stored as a Swarm config
tls:
  certificates:
    - certFile: /run/secrets/whoami_tls_crt
      keyFile: /run/secrets/whoami_tls_key
  options:
    default: {minVersion: VersionTLS12, sniStrict: true}
docker config create traefik_tls_v1 tls-dynamic.yml
services:
  traefik:
    command:
      - --providers.file.filename=/etc/traefik/dynamic/tls.yml
      - --entrypoints.websecure.address=:443
    ports:
      - target: 443
        published: 443
        mode: ingress
    secrets: [whoami_tls_crt, whoami_tls_key]
    configs:
      - source: traefik_tls_v1
        target: /etc/traefik/dynamic/tls.yml
    deploy:
      replicas: 2
      placement:
        max_replicas_per_node: 1
  whoami:
    deploy:
      labels:
        traefik.http.routers.whoami.entrypoints: websecure
        traefik.http.routers.whoami.tls: "true"
secrets:
  whoami_tls_crt: {external: true}
  whoami_tls_key: {external: true}
configs:
  traefik_tls_v1: {external: true}
docker stack deploy -c swarm.yml edge
docker service ps edge_traefik
openssl s_client -connect 127.0.0.1:443 \
  -servername whoami.example.test -CAfile certs/lab-ca.crt </dev/null
docker node update --availability drain LAB_NODE
docker service ps edge_traefik
docker node update --availability active LAB_NODE

configها و secretهای Swarm تغییرناپذیرند؛ برای چرخش، جایگزینی نسخه‌دار بسازید، سرویس را به‌روز کنید، اعتبارسنجی کنید و بعداً شیء قدیمی بلااستفاده را حذف کنید. برای گواهی عمومی با چند نمونه، از صدور خارجی مشابه cert-manager، سامانهٔ secret یا job کنترل‌شدهٔ توزیع گواهی استفاده کنید. فایل محلی ACME در Traefik Proxy را نمی‌توان با ایمنی هم‌زمان به اشتراک گذاشت.

فهرست بررسی معماری

  • حداقل دو گرهٔ واجد شرایط با نمونه‌های جدا از هم وجود دارد.
  • متعادل‌کنندهٔ بار بالادستی فقط گره‌های ورودی آماده را از نظر سلامت بررسی می‌کند.
  • حالت پورت و رفتار IP کلاینت مستند است.
  • صدور، تمدید، توزیع و بازگشت گواهی هرکدام مسئول مشخص دارند.
  • نام secret و config نسخه‌دار است؛ نسخه‌های قدیمی تا پایان اعتبارسنجی باقی می‌مانند.
  • هیچ کلید خصوصی در YAML مربوط به stack، برچسب‌ها، لاگ‌ها یا Git وجود ندارد.

نکته‌های عیب‌یابی

  • مسیر secret در دسترس نیست: secret به سرویس اعطا نشده یا نام مقصد فرق دارد.
  • هر دو نمونه روی یک گره‌اند: قاعدهٔ جانمایی، توپولوژی یا تعداد گره‌های واجد شرایط کافی نیست.
  • انتشار host همراه چند نمونه: روی هر گرهٔ ورودی واجد شرایط یک task بگذارید و متعادل‌کنندهٔ بار خارجی را مطابق آن هدایت کنید.
  • گواهی جدید بارگذاری نشده است: ارجاع config یا secret نسخه‌دار را به‌روز کنید و اگر خود mount تغییر کرده، به‌روزرسانی سرویس را اجبار کنید.

خودآزمایی

  1. چرا config نسخه‌دار مفید است؟ configهای Swarm تغییرناپذیرند و نام نسخه‌دار بازگشت را قابل‌پیش‌بینی می‌کند.
  2. max_replicas_per_node: 1 از چه چیزی جلوگیری می‌کند؟ قرارگرفتن دو نمونه در دامنهٔ خرابی یک گره.
  3. چرا acme.json را با NFS مشترک نکنیم؟ مسئله دسترسی هم‌زمان به وضعیت است، نه فقط ذخیره‌سازی پایدار.
  4. اثبات کنید: یک گره را drain کنید و از نمونهٔ دیگر درخواست TLS موفق بگیرید.