هر بار عضوی به تیم اضافه می‌شود، باید کلیدش را روی تمام سرورها بنویسیم؟ گواهی SSH می‌تواند این چرخه را ساده‌تر کند. امشب یک کاربر و یک host را با CAهای جدا گواهی می‌کنیم و محدودیت زمان و نام را آزمایش می‌کنیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: OpenSSH روی srv و client؛ کلید کاربر شب پانزدهم؛ محیط CA جدا و کلیدهای مخصوص آزمایشگاه.

جایگاه در دوره: هدف‌های 332.1 آزمون 303-300.

این گواهی X.509 نیست#

گواهی OpenSSH قالب خودش را دارد؛ آن را با گواهی HTTPS یا openssl ca نمی‌سازیم. principal مشخص می‌کند گواهی برای کدام نام یا هویت پذیرفته شود؛ بازهٔ اعتبار و شمارهٔ سریال برای کنترل چرخهٔ دسترسی مهم‌اند. کلید CA کاربر را از CA میزبان جدا نگه دار تا نقش‌ها مخلوط نشوند.

در حساب مخصوص CA:

umask 077
mkdir -p ~/lpic303/ssh-ca
cd ~/lpic303/ssh-ca
ssh-keygen -t ed25519 -f user_ca -C 'Lab user CA'
ssh-keygen -t ed25519 -f host_ca -C 'Lab host CA'

برای هر دو گذرواژه بگذار. فایل عمومی lpic303_student.pub را از client به این پوشه کپی کن؛ کلید خصوصی کاربر نیاز نیست.

ssh-keygen -s user_ca -I student-session-1 -z 1 \
  -n student -V -5m:+1h lpic303_student.pub
ssh-keygen -L -f lpic303_student-cert.pub

گواهی خروجی را کنار کلید کاربر روی client بگذار. روی srv، user_ca.pub را در مسیر /etc/ssh/lpic303_user_ca.pub نصب کن و این گزینه را به تنظیم SSH اضافه کن:

TrustedUserCAKeys /etc/ssh/lpic303_user_ca.pub

اگر AuthorizedPrincipalsFile تعریف نشده باشد، principal باید با نام حساب ورود سازگار باشد. بعد از sshd -t و reload، ورود را با CertificateFile صریح آزمایش کن:

ssh -i ~/.ssh/lpic303_student \
  -o CertificateFile=~/.ssh/lpic303_student-cert.pub student@192.168.56.10

برای اثبات استفاده از گواهی، کلید خام را در Clone از authorized_keys کنار بگذار؛ وگرنه موفقیت ورود ممکن است از کلید خام باشد. گواهی principal اشتباه یا منقضی باید رد شود؛ ساعت دو طرف مهم است.

گواهی میزبان#

کلید عمومی host سرور را به CA منتقل کن و نام میزبان واقعی آزمایشگاه را گواهی کن:

ssh-keygen -s host_ca -I srv-host -z 1 -h \
  -n srv.example.test -V -5m:+1d ssh_host_ed25519_key.pub

خروجی روی srv نصب و با HostCertificate معرفی می‌شود. روی client، نام srv.example.test را در /etc/hosts به IP سرور وصل کن و یک سطر @cert-authority srv.example.test همراه محتوای واقعی host_ca.pub در known_hosts بنویس. اتصال با IP به‌جای نام گواهی، آزمون همان principal نیست.

پایان دسترسی#

گواهی کوتاه‌عمر فرصت سوءاستفاده را محدود می‌کند؛ برای ابطال زودتر، OpenSSH از KRL، یعنی فهرست ابطال کلید، و RevokedKeys پشتیبانی می‌کند. از ssh-keygen -k روی فایل‌های آزمایشگاهی استفاده و با -Q بررسی کن. برای بازگشت، تنظیم CA و host certificate آزمایشگاه را از کنسول حذف، validate و reload کن.

خودآزمایی: چرا کپی‌کردن کلید خصوصی CA روی تمام سرورها، مزیت این معماری را از بین می‌برد؟ مرجع گزینه‌های صدور و KRL: ssh-keygen .