WIUNIX ACADEMY
ورود کوتاهمدت با گواهی OpenSSH و آزمون ابطال دسترسی
بدون تغییر SSH اصلی، یک sshd جدا روی loopback راه بیندازید؛ گواهی محدود صادر کنید و نشان دهید ابطال، اتصال تازه را رد میکند.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من4 مقدار قابلتغییر
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
در یک محیط آزمایشی جدا، ورود با گواهی کوتاهمدت را از ورود با کلید عمومی بدون گواهی جدا کنید و اثر فهرست ابطال را روی همان گواهی بسنجید.
سیستمعاملها و نسخههای پوششدادهشده
مسیرهای این آموزش با مستندات رسمی ابزار و توزیع انتخابی بررسی شدهاند. فرمانهای آموزشی روی سرویس شما اجرا نشدهاند؛ نتیجهٔ محیط خودتان را در هر گام بررسی کنید.
قبل از شروع
- یک VM آزمایشی دورریختنی با OpenSSH Server نصبشده و یک حساب غیرroot موجود، مجاز و قفلنشده.
- نشست مدیریت معمول باز میماند؛ پورت انتخابی آزاد و فقط روی loopback استفاده میشود.
- کلید CA و کلید کاربر فقط در محیط خصوصی آزمایش نگهداری میشوند؛ passphrase در ترمینال وارد میشود، نه فرم مرورگر یا خط فرمان.
CA آزمایشی را از ورود واقعی جدا نگه دارید
این تمرین روی یک VM و یک حساب موجود انجام میشود؛ معماری CA محیط عملیاتی نیست. تنظیم SSH اصلی، کلید ورود معمول و پورت عمومی دستنخورده میمانند.
در محیط عملیاتی، نگهداری امن و جداگانهٔ CA، ثبت صدور، ساعت دقیق و توزیع قابل اعتماد ابطال لازم است. گواهی کاربر، مالکیت یک کلید عمومی را با مجوزهای مشخص تأیید میکند؛ جای بررسی host key سرور را نمیگیرد.
قدم بعدی
پیش از شروع، ابزار و تفاوتهای توزیع را بررسی کنید
این گام روی همان میزبان آزمایش یا عیبیابی اجرا میشود. نام و نسخهٔ سیستمعامل و بستههای فهرستشده را با محیط انتخابی تطبیق دهید. اگر ابزاری نصب نیست، ابتدا از مخزن رسمی فعال و روند مجاز مدیریت بستهٔ خود آن را نصب کنید؛ این آموزش سرور موجود را دوباره نصب یا مخزنش را عوض نمیکند.
در RHEL، مخزنهای مجاز همان اشتراک و در Rocky Linux و AlmaLinux، مخزنهای رسمی همان نسخه لازماند. نسخهٔ فرعیِ تحت پشتیبانی را بهروز نگه دارید؛ انتخاب نسخهٔ اصلی به معنی سازگاری تمام بستههای قدیمی یا سفارشی نیست. SELinux و سیاست رمزنگاری سیستم بخشی از محیطاند و برای عبور از خطا خاموش نمیشوند.
نام بستهٔ کلاینت در این مسیر openssh-clients است. سرویس عادی sshd فقط برای ثبت وضع موجود بررسی میشود؛ تمرین، آن را start، restart یا reload نمیکند. حساب آزمایش باید از قبل معتبر، غیر root و مجاز باشد. روی خانوادهٔ Red Hat، کلیدهای آزمایش RSA با اندازهٔ 3072 بیت ساخته میشوند؛ Ed25519 در حالت FIPS قابل استفاده نیست. استفاده از RSA در اینجا به معنی تأیید FIPS کل محیط نیست.
اگر پیشنیاز بسته یا دایرکتوری privilege separation موجود نیست، قبل از ساخت آزمایش، آمادهسازی رسمی همان بسته را روی VM انجام دهید. نبود پیشنیاز جداسازی بسته را با خاموشکردن privilege separation یا تغییر SSH اصلی دور نزنید.
بستههای جاری این خانواده شاخهٔ جداسازی را زیر /usr/share با نام empty.sshd قرار میدهند؛ آن را از فهرست فایلهای همان بسته و مجوزهایش تأیید کنید. سرور آزمایش فقط فایل سیاست رمزنگاری سیستم را وارد میکند و کلاینت نیز فقط همان سیاست کلاینت را میخواند؛ تنظیمات اتصال و مجوزهای SSH اصلی وارد آزمایش نمیشوند. اگر فایل سیاست موجود نیست، نحو پشتیبانی نمیشود یا سیاست انتخابی این نوع گواهی را منع میکند، متوقف شوید و همان بسته و سیاست را بررسی کنید؛ سیاست را ضعیف نکنید.
ترمینال میزبان مجاز معرفیشده در همین بخش
cat /etc/os-release
rpm -q openssh-server openssh-clients iproute policycoreutils-python-utils audit
command -v ssh ssh-keygen ss
systemctl show sshd.service -p ActiveState -p FragmentPath
sudo test -x /usr/sbin/sshd
rpm -ql openssh-server | grep -E '/empty\.sshd$|/sshd-session$'
sudo stat -c '%U %G %a %n' /usr/share/empty.sshd
sudo test -r /etc/crypto-policies/back-ends/opensshserver.config || exit 1
sudo test -r /etc/crypto-policies/back-ends/openssh.config || exit 1
update-crypto-policies --showبسته و ابزار لازم شناسایی شده است؛ خطا یا نبود ابزار را پیش از ادامه رفع کنید.
قدم بعدی
حساب، پورت و شاخه را پیش از ساخت تطبیق دهید
نشست مدیریت عادی را باز نگه دارید. حساب labuser باید از قبل وجود داشته، غیرroot و مجاز به ورود باشد. نبود حساب، قفلبودن آن یا اشغالبودن پورت 22222 دلیل توقف است؛ این آموزش PAM یا وضعیت حساب را تغییر نمیدهد.
/var/lib/academy-ssh-cert-lab باید مسیر تازه باشد، نه symlink، mount یا دادهٔ برنامه. خروجی پورت را بخوانید؛ اگر شنوندهای دیده میشود، پورت تازهای در تنظیمات انتخاب کنید.
ترمینال همان میزبان معرفیشده در توضیح گام
date -u +'%Y-%m-%dT%H:%M:%SZ'
ssh -V
getent passwd 'labuser'
test "$(id -u 'labuser')" -ne 0 || exit 1
sudo ss -lntp 'sport = :22222'
sudo test ! -e '/var/lib/academy-ssh-cert-lab' || exit 1
sudo mkdir -m 0700 -- '/var/lib/academy-ssh-cert-lab'حساب درست، پورت آزاد و شاخهٔ اختصاصی تازه با مالک root مشخصاند.
قدم بعدی
سه نقش کلید را از هم جدا کنید
روی این مسیر سه کلید RSA با اندازهٔ 3072 بیت بسازید. CA و کلید کاربر گذرواژهٔ تعاملی میگیرند؛ کلید میزبانِ daemon غیرتعاملی، فقط در دایرکتوری خصوصی root و با مجوز 0600 نگهداری میشود. Ed25519 در FIPS در دسترس نیست؛ سیاست رمزنگاری سیستم را پایین نیاورید. نام فایل کلید میزبان با الگوی استاندارد سیاست SELinux همخوان انتخاب شده است.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo ssh-keygen -t rsa -b 3072 -f '/var/lib/academy-ssh-cert-lab/user-ca' -C academy-lab-ca
sudo ssh-keygen -t rsa -b 3072 -f '/var/lib/academy-ssh-cert-lab/client' -C academy-lab-user
sudo ssh-keygen -t rsa -b 3072 -N '' -f '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key' -C academy-lab-host
sudo ssh-keygen -lf '/var/lib/academy-ssh-cert-lab/user-ca.pub'
sudo ssh-keygen -lf '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key.pub'سه جفت کلید مستقل ساخته شدهاند و بخش خصوصی فقط برای root خواندنی است؛ تنها fingerprint عمومی را ثبت کنید.
قدم بعدی
نام مجاز را به همان حساب وصل کنید
فایل principals فقط academy-operator را برای حساب labuser مجاز میکند. sshd ممکن است این فایل را با دسترسی حساب هدف بخواند؛ به همین دلیل دایرکتوری والد مجوز عبور 0711 دارد و فایل نگاشت عمومی در شاخهای با مجوز 0755 و با مجوز فایل 0644 قرار میگیرد.
فهرست شاخه و کلیدهای خصوصی عمومی نمیشوند؛ هر کلید خصوصی root0600 میماند. RevokedKeys ابتدا یک فایل متن خالی و خواندنی است. ناخواندنیشدن آن میتواند همهٔ احراز هویت public key این listener را رد کند، پس خوانایی و جایگزینی سالمش مهم است.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo chmod 0600 '/var/lib/academy-ssh-cert-lab/user-ca' '/var/lib/academy-ssh-cert-lab/client' '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key'
sudo chmod 0711 '/var/lib/academy-ssh-cert-lab'
sudo install -d -m 0755 '/var/lib/academy-ssh-cert-lab/principals'
printf '%s\n' 'academy-operator' | sudo tee '/var/lib/academy-ssh-cert-lab/principals/labuser' >/dev/null
sudo chmod 0644 '/var/lib/academy-ssh-cert-lab/principals/labuser'
sudo install -m 0644 /dev/null '/var/lib/academy-ssh-cert-lab/revoked'
sudoedit '/var/lib/academy-ssh-cert-lab/sshd_config'نگاشت صریح حساب و فایل ابطال خواندنی آمادهاند؛ فقط فایل تنظیم تازهٔ آزمایش ویرایش میشود.
listener آزمایش را فقط به loopback محدود کنید
این فایل فقط سیاست الگوریتمهای رمزنگاری سیستم را از فایل رسمی backend وارد میکند؛ فایل اصلی sshd_config و تنظیمات listener یا دسترسی سرویس اصلی وارد نمیشوند. سایر خطوط، daemon جدا را به loopback، حساب مشخص و فرمان ثابت محدود میکنند. گذرواژه، کلید عمومی بدون گواهی، shell تعاملی و forwarding در این listener مجاز نیستند. فایل را جایگزین تنظیم SSH اصلی نکنید.
محتوای فایل؛ این پنل را در ترمینال اجرا نکنید
Include /etc/crypto-policies/back-ends/opensshserver.config
Port 22222
ListenAddress 127.0.0.1
HostKey /var/lib/academy-ssh-cert-lab/ssh_host_rsa_key
PidFile none
UsePAM yes
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
AuthenticationMethods publickey
AuthorizedKeysFile none
TrustedUserCAKeys /var/lib/academy-ssh-cert-lab/user-ca.pub
AuthorizedPrincipalsFile /var/lib/academy-ssh-cert-lab/principals/%u
RevokedKeys /var/lib/academy-ssh-cert-lab/revoked
AllowUsers labuser
PermitRootLogin no
DisableForwarding yes
X11Forwarding no
PermitTTY no
ForceCommand /usr/bin/id
LogLevel VERBOSE