SSH-LAST(1) User Commands SSH-LAST(1)

ssh-last - فهرست کردن آخرین نشست‌های SSH

           ssh-last [OPTIONS]
ssh_logs | ssh-last [OPTIONS]

-a  نمایش تمام نشست‌ها                           (نمایش داده‌هایی که توسط فایل 'ignored' پنهان شده‌اند)
-c  خروجی رنگی                                  (برجسته‌سازی نشست‌های فعال SSH)
-d  اشکال‌زدایی (debug)
-f  اجبار به نمایش اثرانگشت‌ها                   (عدم نگاشت از فایل 'known')
-h  نمایش این پیام راهنما
-i  اجبار به نمایش شناسه گواهی‌ها                (عدم نگاشت از فایل 'known'، همراه با -f استفاده نشود)
-l  تلاش برای استفاده از فایل‌های لاگ به جای journalctl   (ممکن است در برخی سیستم‌ها سریع‌تر باشد)
-n  نمایش نام میزبان/IP به صورت متن خام         (عدم نگاشت از فایل 'known')
-w  تنها نمایش نشست‌های فعال SSH
-?  نمایش راهنمای کامل با اطلاعات دقیق‌تر
    (معمولاً برای عملکرد صحیح نیاز به نصب perl-doc دارد)
--version    نمایش اطلاعات نسخه

ssh-last
ssh-last -c | more
ssh-last -c | less -R   # حفظ خروجی رنگی در less
ssh-last -cw
# لاگ‌های دیروز
LC_TIME=C journalctl _COMM=sshd -g 'Accepted|Disconnected' --since yesterday               | ssh-last
# لاگ‌های سه روز پیش
LC_TIME=C journalctl _COMM=sshd -g 'Accepted|Disconnected' --since -3d --until -2d         | ssh-last
# لاگ‌های یک ساعت گذشته
LC_TIME=C journalctl _COMM=sshd -g 'Accepted|Disconnected' --since -1h                     | ssh-last
# لاگ‌ها تا یک تاریخ مشخص
LC_TIME=C journalctl _COMM=sshd -g 'Accepted|Disconnected' --until "2022-03-12 07:00:00"   | ssh-last
# از فایل‌های لاگ (ترتیب باید از قدیمی‌ترین به جدیدترین باشد)
zgrep -hE 'Accepted|Disconnected' auth.log.2.gz  auth.log.1  auth.log                      | ssh-last
zgrep -hE 'Accepted|Disconnected' $(ls /var/log/auth.log* --sort=time --reverse)           | ssh-last
zgrep -hE 'Accepted|Disconnected' $(ls /var/log/messages* --sort=time --reverse)           | ssh-last
zgrep -hE 'Accepted|Disconnected' $(ls /var/log/secure*   --sort=time --reverse)           | ssh-last

ابزار ssh-last مانند دستور last عمل می‌کند، اما برای نشست‌های SSH است.

+--------------------------------------------------------------------------+
|                                                                          |
| AUTH_ID                                                                  |
|                                                                          |
| (C) sshd authorized login via (c)ertificate                              |
| (K) sshd authorized login via public (k)ey                               |
| (?) sshd authorized login via some other type (password, pam)            |
|                                                                          |
+--------------------------------------------------------------------------+

بررسی دقیق لاگ‌های sshd به ترتیب زمانی:
۱) یافتن خطوط ورود (Accepted) و خروج (Disconnected).
۲) ذخیره اطلاعات خطوط مانند username ،auth_type ،fingerprint و...
۳) استفاده از پورت شبکه استفاده‌شده برای بررسی نشست‌های فعال
   و بازسازی نشست‌های قدیمی با به خاطر سپردن پورت‌های شبکه ثبت‌شده
۴) استفاده عمده از /etc/os-release برای سازگاری با سیستم‌های مختلف
   که در نام فایل‌های لاگ، الگوهای لاگ‌اندازی و غیره با هم تفاوت دارند...

 /etc/ssh-tools/ssh-last/ignored
~/.config/ssh-tools/ssh-last/ignored
./ignored
این داده‌ها در خروجی پنهان خواهند شد مگر اینکه با گزینه -a اجبار شود
+--------------------------------------------------------------------------+
|# Fingerprints                                                            |
|                                                                          |
|SHA256:ElgyEn5xPe4VlK5jJkqauRdAKNRHdh2tGHfo0m9/IwW Jenkins                |
|SHA256:5xPe4JkqaElKNRHGHfxPe4RdAKdh2tlK5AKNRHn5xK5 foo          # comment |
|SHA256:nmKL5s7/fs45312nvjhFSRTREa44r2hfgJHJG54353R   bar@gmx.de           |
|                                                                          |
|# Hosts                                                                   |
|                                                                          |
|127.0.0.1       localhost   # local ssh logins                            |
|192.168.1.50    nas         # more comments                               |
|webserver                   # alias from the 'known' file                 |
|                                                                          |
|# Cert IDs                                                                |
|                                                                          |
|user1@company.com                                                         |
|user2@company.com with some info                                          |
|user3@company.com with some info # and a comment                          |
|                                                                          |
|# Users                                                                   |
|                                                                          |
|git # gitlab                                                              |
+--------------------------------------------------------------------------+

 /etc/ssh-tools/ssh-last/known
~/.config/ssh-tools/ssh-last/known
./known
برای این کلیدها مقدار نگاشت‌شده به جای کلید نمایش داده خواهد شد،
مگر اینکه با گزینه‌های -f (اثرانگشت‌ها) و -n (میزبان‌ها)
یا گزینه -i (شناسه‌های گواهی) اجبار شود
+--------------------------------------------------------------------------+
|# Fingerprints                                                            |
|                                                                          |
|SHA256:WwI/9m0ofHGt2hdHRNKAdRuaqkJj5KlV4ePx5nEyglE Sven Wick              |
|SHA256:xyk5ZZZWZKnmKL5mYdk8Poy5eds7/CD/JEwqykMnlQQ root@n40l    # comment |
|SHA256:G7h9i5+NDU72Ae40gCkxyvDz/8BH+KETw7sXHCYr5w0   sven.wick@gmx.de     |
|                                                                          |
|# Hosts                                                                   |
|                                                                          |
|127.0.0.1       localhost   # local ssh logins                            |
|192.168.1.50    nas         # more comments                               |
|192.168.50.100  webserver                                                 |
|                                                                          |
|# Cert IDs                                                                |
|                                                                          |
|user1@company.com   vaporup                                               |
+--------------------------------------------------------------------------+

استفاده از یک JumpHost با ProxyCommand یا ProxyJump،
اغلب ممکن است منجر به قطع ارتباط ناقص بدون ثبت هیچ لاگی شود،
بنابراین LOGOUT و DURATION قابل نمایش نخواهند بود.

در صورت امکان، ssh-last را به عنوان ریشه (root) یا از طریق sudo اجرا کنید
۱) فایل‌های لاگ و ژورنال systemd معمولاً توسط یک کاربر عادی قابل خواندن نیستند
۲) گزینه ssh-last -w تنها به عنوان کاربر root به طور قابل اعتماد کار می‌کند،
   زیرا ss و netstat هنگام اجرا توسط کاربر عادی، اطلاعات فرآیند را نمایش نمی‌دهند
۳) دستور ssh-last تلاش می‌کند اثرانگشت را از فایل authorized_keys کاربر نگاشت کند
   اما معمولاً کاربران اجازه دسترسی به فایل‌های یکدیگر را ندارند

اگر یک ارتقای درجا (in-place) مانند dist-upgrade را در Debian/Ubuntu انجام دهید،
بسته به تفاوت نسخه،
ممکن است رخ دهد که sshd از آن نقطه به بعد به شکلی متفاوت لاگ ثبت کند
و ممکن است ترکیبی از لاگ‌ها با قالب جدید و قدیمی داشته باشید
که در نتیجه ssh-last تنها جدیدترین موارد را به درستی نمایش می‌دهد

مواردی مشاهده شده است که برخی از پیام‌های لاگ "Disconnect" مربوط به sshd
در ژورنال systemd مفقود بودند اما در /var/log/auth.log وجود داشتند.
بنابراین، اگر ssh-last زمان خروج و مدت‌زمان را نمایش نمی‌دهد
اما خطوط لاگ در فایل لاگ وجود دارند، بررسی کنید که آیا پیام لاگ
واقعاً به ژورنال systemd رسیده است یا خیر، زیرا ssh-last به طور پیش‌فرض از journald استفاده می‌کند

برای راحتی می‌توانید اسکریپت‌های واسط کوچکی مانند نمونه زیر بسازید
که با محدود کردن داده‌ها صرفاً به هفته گذشته، از پردازش لاگ‌های بسیار زیاد جلوگیری می‌کند
my-ssh-last
+--------------------------------------------------------------------------+
| #!/usr/bin/env bash                                                      |
|                                                                          |
| LC_TIME=C journalctl _COMM=sshd --since -1week \                         |
| | grep -E 'Accepted|Disconnected'              \                         |
| | ssh-last "$@"                                                          |
|                                                                          |
+--------------------------------------------------------------------------+

ssh-keyinfo(1), ssh-certinfo(1)

Sven Wick <sven.wick@gmx.de>

2024-09-26 SSH-TOOLS