با یک تغییر، ورود رمز عبور بسته می‌شود؛ با همان تغییر ممکن است خود مدیر هم پشت در بماند. امشب تنظیم OpenSSH را با یک نشست پشتیبان و آزمون ورود تازه سخت‌تر می‌کنیم.

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

محیط تمرین: srv و client با Ubuntu 24.04؛ openssh-server و openssh-client؛ حساب student و کنسول مستقل.

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

اعتماد در دو جهت#

سرور باید کاربر را بشناسد؛ کاربر هم باید سرور را بشناسد. کلید host را با کلید کاربر اشتباه نگیر. هشدار تغییر host key می‌تواند ناشی از نصب مجدد یا حمله باشد؛ پاک کردن known_hosts بدون بررسی، شاهد را حذف می‌کند.

روی client، کلید تازهٔ مختص این آزمایش بساز:

ssh-keygen -t ed25519 -f ~/.ssh/lpic303_student -C 'LPIC303 lab'
ssh-copy-id -i ~/.ssh/lpic303_student.pub student@192.168.56.10
ssh -i ~/.ssh/lpic303_student student@192.168.56.10

گذرواژهٔ کلید انتخاب کن. اثر انگشت host را از کنسول srv با ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub مقایسه کن. نشست فعلی و کنسول را باز نگه دار؛ ورود با کلید باید پیش از بستن password موفق باشد.

اول تنظیم مؤثر را ببین#

OpenSSH در بسیاری از گزینه‌ها اولین مقدار خوانده‌شده را نگه می‌دارد؛ فایل جدید با شمارهٔ بزرگ الزاماً override نیست. Includeها و Matchها را بررسی کن و snippet آزمایشگاهی را در محل مناسب بنویس:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers student
X11Forwarding no
AllowTcpForwarding no

این policy برای سرور تک‌کاربرهٔ این آزمایش است؛ اگر حساب sudo دیگری به SSH نیاز دارد، باید در AllowUsers حضور داشته باشد. AllowTcpForwarding no عمداً تمرین‌های port forwarding را محدود می‌کند، ولی دسترسی یک کاربر دارای shell به شبکه را به‌تنهایی حذف نمی‌کند.

sudo /usr/sbin/sshd -t
sudo /usr/sbin/sshd -T -C user=student,host=client,addr=192.168.56.20
sudo systemctl reload ssh

قبل از reload، در خروجی -T مقدارهای password و root را بررسی کن. در Ubuntu نام unit معمولاً ssh است؛ Rocky معمولاً sshd دارد. عوض کردن پورت، جای احراز هویت و محدود کردن مبدأ را نمی‌گیرد.

آزمون واقعی#

یک نشست تازه با کلید باز کن؛ سپس از کلاینت، ورود بدون public key را با ssh -o PubkeyAuthentication=no student@192.168.56.10 امتحان کن. باید رد شود. لاگ را با journalctl -u ssh --since '10 minutes ago' ببین؛ همهٔ نصب‌ها رویدادهای auth را فقط در همین unit ثبت نمی‌کنند، پس auth.log یا لاگ عمومی را هم بررسی کن.

برای برگشت، از کنسول snippet خودت را کنار بگذار، sshd -t و reload کن. حذف کلید از client، دسترسی آن کلید روی سرور را ابطال نمی‌کند؛ کلید عمومی باید از authorized_keys هم برداشته شود.

تمرین: خطای مجوز پوشهٔ .ssh را از خطای شبکه چگونه تفکیک می‌کنی؟ مجوزهای مالک، مسیر و لاگ auth را بررسی کن؛ از chmod 777 استفاده نکن. مرجع: sshd_config و ssh_config .