WIUNIX ACADEMY
ورود کوتاهمدت با گواهی OpenSSH و آزمون ابطال دسترسی
صفحهٔ 2 از 3؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من4 مقدار قابلتغییر
قدم بعدی
برچسب و پورت آزمایش را در SELinux محدود و ثبت کنید
این گام فقط روی VM اختصاصی با SELinux فعال و سیاست استاندارد OpenSSH انجام میشود. قبل از افزودن، فهرست محلی نگاشت مسیر و همهٔ پورتها را بخوانید: پورت انتخابی نباید نگاشت اختصاصی سرویس دیگری، مستقیم یا درون یک بازه، یا تغییر محلی قبلی داشته باشد و مسیر نباید معادلسازی قبلی داشته باشد. در صورت تعارض، مقدار تازه انتخاب کنید؛ نگاشت موجود را modify یا حذف نکنید. خطای نبود ابزار را با خاموشکردن SELinux دور نزنید. بازهٔ عمومی unreserved_port_t با نگاشت اختصاصی یک سرویس فرق دارد؛ آن را تغییر ندهید. این تمرین فقط یک نگاشت تازهٔ ssh_port_t برای پورت آزاد خود میافزاید و هرگز از گزینهٔ modify استفاده نمیکند.
پس از تأیید نبود تعارض، دو نگاشت جدید پایین فقط برای همین آزمایش اضافه میشوند. معادلسازی با شاخهٔ تنظیم SSH باعث میشود نام استاندارد کلید میزبان برچسب لازم بگیرد؛ restorecon را فقط روی شاخهٔ تازهٔ آزمایش اجرا کنید. خروجی را نگه دارید و تأیید کنید کلید میزبان sshd_key_t دارد. اگر سیاست نصبشده نتیجهٔ دیگری میدهد یا AVC باقی است، متوقف شوید؛ قاعدهٔ خودکار allow تولید نکنید. پورت فقط در سیاست SELinux ثبت میشود، نه در فایروال عمومی.
ترمینال میزبان مجاز معرفیشده در همین بخش
getenforce
sudo semanage fcontext -l -C
sudo semanage port -l
read -r -p 'Type ADD-LAB-MAPPINGS only after checking the conditions above: ' academy_policy_confirm
test "$academy_policy_confirm" = ADD-LAB-MAPPINGS || exit 1
sudo semanage fcontext -a -e /etc/ssh '/var/lib/academy-ssh-cert-lab' || exit 1
sudo semanage port -a -t ssh_port_t -p tcp '22222' || exit 1
sudo restorecon -Rv '/var/lib/academy-ssh-cert-lab'
ls -Zd '/var/lib/academy-ssh-cert-lab' '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key'
matchpathcon '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key'
sudo ausearch -m AVC,USER_AVC -ts recentکلید میزبان برچسب sshd_key_t دارد؛ هر دو نگاشت تازه و خروجیشان ثبت شدهاند و هیچ پورت ورودی فایروال باز نشده است.
قدم بعدی
فایل جدا را بررسی کنید، نه SSH اصلی را
اعتبارسنجی نحو و نمایش تنظیمات مؤثر را با مسیر صریح فایل آزمایش اجرا کنید. port، listenaddress، مسیر اعتماد و ابطال، روش احراز هویت و فرمان اجباری باید با همین تمرین یکی باشند.
اگر ابزار از پیشنیاز بستهای مانند شاخهٔ privilege separation شکایت کرد، همان نصب VM را از روند بومی بسته اصلاح کنید. تنظیمات سرویس اصلی را تغییر ندهید و برای عبور از خطا، جداسازی یا SELinux را خاموش نکنید.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo /usr/sbin/sshd -t -f '/var/lib/academy-ssh-cert-lab/sshd_config' || exit 1
sudo /usr/sbin/sshd -T -f '/var/lib/academy-ssh-cert-lab/sshd_config' | awk '$1 ~ /^(port|listenaddress|trustedusercakeys|authorizedprincipalsfile|revokedkeys|forcecommand|authenticationmethods|authorizedkeysfile)$/ {print}'فایل جدا parse میشود و تنها127.0.0.1 روی پورت انتخابی در تنظیم listener دیده میشود.
قدم بعدی
daemon آزمایش را در ترمینال جدا اجرا کنید
روی همان VM یک ترمینال مجاز جدا باز کنید و این فرایند foreground را در آن اجرا نگه دارید. فرمان، سرویس SSH اصلی را start، restart یا enable نمیکند.
ترمینال daemon محل دیدن دلیل رد گواهی است؛ خروجی آن میتواند نام کاربر داشته باشد و باید خصوصی بماند. در پایان تمرین، فقط همین فرایند را با Ctrl+C متوقف کنید.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo /usr/sbin/sshd -D -e -f '/var/lib/academy-ssh-cert-lab/sshd_config'فرایند جدا روی loopback گوش میدهد؛ بررسی کلاینت از ترمینال دیگری انجام میشود.
قدم بعدی
host key آزمایش را از فایل معتبر محلی ثبت کنید
در ترمینال دوم، listener را بررسی و fingerprint host key ساختهشده را تطبیق دهید. known_hosts جدا را از همان کلید عمومی محلی تهیه میکنیم؛ یک keyscan شبکهای بهتنهایی هویت سرور دور را تأیید نمیکند.
هیچ ورودی known_hosts عادی حذف نمیشود و بررسی host key هم خاموش نمیشود. فایل جدا فقط به همین loopback و پورت آزمایش مربوط است.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo ss -lntp 'sport = :22222'
sudo ssh-keygen -lf '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key.pub'
sudo awk '{print "[127.0.0.1]:22222 " $1 " " $2}' '/var/lib/academy-ssh-cert-lab/ssh_host_rsa_key.pub' | sudo tee '/var/lib/academy-ssh-cert-lab/known_hosts' >/dev/null
sudo chmod 0644 '/var/lib/academy-ssh-cert-lab/known_hosts'فقط loopback شنونده است و fingerprint ثبتشده با ورودی جداگانهٔ known_hosts یکی است.
قدم بعدی
درست پیش از ورود، گواهی کوتاهمدت صادر کنید
فقط کلید عمومی کاربر امضا میشود. serial1001 و key ID این صدور را مشخص میکنند و principal باید با نگاشت حساب یکی باشد. صدور را اینجا انجام میدهیم تا اعتبار پانزدهدقیقهای هنگام آمادهسازی محیط از دست نرود.
یک دقیقه ارفاق شروع، جای ساعت درست را نمیگیرد. با پاکشدن extensionهای پیشفرض، مجوز forwarding و PTY اضافه نمیشود؛ daemon نیز فرمان ثابت را تحمیل میکند. passphrase کلید CA را تعاملی وارد کنید.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo ssh-keygen -s '/var/lib/academy-ssh-cert-lab/user-ca' -I academy-user-1001 -z 1001 -n 'academy-operator' -V -1m:+15m -O clear '/var/lib/academy-ssh-cert-lab/client.pub'
sudo ssh-keygen -L -f '/var/lib/academy-ssh-cert-lab/client-cert.pub'گواهی USER، با CA و principal درست، serial1001، اعتبار کوتاه و بدون extension پیشفرض دیده میشود.
قدم بعدی
ورود محدود با گواهی را امتحان کنید
کلاینت فقط فایل رسمی سیاست الگوریتمهای رمزنگاری سیستم را میخواند؛ تنظیمات شخصی و فایل اصلی کلاینت SSH استفاده نمیشوند. کلید و گواهی آزمایش، known_hosts اختصاصی و نبود agent صریحاند. اگر سیاست فعال الگوریتم یا نوع گواهی را رد میکند، آن را برای عبور از آزمایش ضعیف نکنید. پس از واردکردن گذرواژهٔ کلید کاربر، تنها فرمان ثابت id باید هویت labuser را نشان دهد و اتصال بسته شود.
ترمینال همان میزبان معرفیشده در توضیح گام
sudo ssh -F /etc/crypto-policies/back-ends/openssh.config -o StrictHostKeyChecking=yes -o 'UserKnownHostsFile=/var/lib/academy-ssh-cert-lab/known_hosts' -o IdentitiesOnly=yes -o IdentityAgent=none -i '/var/lib/academy-ssh-cert-lab/client' -o 'CertificateFile=/var/lib/academy-ssh-cert-lab/client-cert.pub' -p '22222' 'labuser@127.0.0.1'هویت حساب غیرroot چاپ و اتصال بسته میشود؛ اگر ورود رد شد، دلیلش را در همان daemon آزمایش پیدا کنید.