Son güncelleme tarihi 5 Eylül 2022
SSH Login Loglama?
SSH Login Loglama işleminden önce, Linux sistem kurmuş ve yöneten herkesin kesinlikle kullandığı ve kullanması gereken bir protokoldür SSH, varsayılan olarak TCP 22 portu üzerinden iletişim sağlanır. RFC-4253 içerisinden teknik dökümanına erişilebilir, SSH Login Loglama ise bu yazımızın asıl hedef noktası olmakla birlikte birkaç tanım daha yapalım.

SSH protokolü, teknik altyapısı ve kullanım alanları başka bir yazının konusu, bu yazımda Linux sistemimize bu protokol üzerinden iletişim kurulduğunda erişim sağlayan (login) kullanıcının bilgilerini loglama işleminden ve bu log dosyalarının şişmemesi için log rotasyonu işleminden bahsedeceğim. Kullandığım sistem Debian GNU/Linux 11 (bullseye) üzerinde OpenSSH 8.4 ve logrotate 3.18.0 Open SSH ve logrotate kullanan diğer dağıtımlarda da konfigürasyon aynı olduğundan diğer dağıtımlarda da çalışacaktır.
PAM nedir?
PAM detaylı olarak başka bir yazıda ele alınacağından sadece tanımı ve ihtiyacımız olan konfigürasyon dosyasını belirteceğim. man pam
komutu ile detaylı bilgiye erişilebilir ve bu döküman içerisinde belirtilen tanım;
NAME
pam – Pluggable Authentication Modules Library
(Takılabilir Kimlik Doğrulama Modülleri Kitaplığı) şeklindedir.
Tanımdan da anlaşılacağı üzere Linux sistemimize kimlik doğrulayarak erişebilmemiz için gerekli kitaplıklar bu sistem tarafından yönetilir. SSH ile login işlemi için de /etc/pam.d/sshd
dosyası içerisindeki konfigürasyon kullanılır. Biz de bu dosya içerisinde kendi yazacağımız çalıştırılabilir shell
dosyamıza tetikleme satırı ekleyeceğiz.

SSH Login Loglama İçin pam_exec
ile tetiklenecek shell scriptini hazırlayalım.
Hazırlayacağımız script içerisinde;
man pam_exec
komutu ile görebileceğimiz PAM_TYPE , PAM_RUSER , PAM_USER PAM_RHOST
değişkenlerini, ayrıca hostname, ve işlemin yapıldığı tarih bilgilerini loglama için kullanacağız.
root@uxn-workstation:/etc/pam.d# man pam_exec PAM_EXEC(8) Linux-PAM Manual PAM_EXEC(8) NAME pam_exec - PAM module which calls an external command SYNOPSIS pam_exec.so [debug] [expose_authtok] [seteuid] [quiet] [stdout] [log=file] [type=type] command [...] DESCRIPTION ... items are exported as environment variables: PAM_RHOST, PAM_RUSER, PAM_SERVICE, PAM_TTY, PAM_USER and PAM_TYPE, which contains one of the module types: account, auth, password, open_session and close_session. ...
Herhangi bir metin editörüyle dosyamızı /usr/bin/ssh-login-notify.sh
şeklinde oluşturup aşağıdaki kodu içerisine ekleyelim.
nano /usr/bin/ssh-login-notify.sh
#!/usr/bin/sh if [ "$PAM_TYPE" != "close_session" ]; then host="$(hostname -f)" subject="SSH Login: $PAM_RUSER as $PAM_USER from $PAM_RHOST on $host" message="$subject $(date)" echo "$message" >> /var/log/ssh-login.log fi exit 0
Shell scriptimizi çalıştırılabilir hale getirelim ve log dosyamızı oluşturalım.
chmod +x /usr/bin/ssh-login-notify.sh touch /var/log/ssh-login.log
SSH Login Loglama İçin pam.d/sshd dosyamıza ek yapalım.
Buraya kadar tetiklenecek shell script hazırlandı, her ssh login işleminde tetikleyecek olan satırı /etc/pam.d/sshd
dosyamızın ilgili satırına ekleyelim.
/etc/pam.d/sshd dosyamız içerisinde;
@include common-auth ... @include common-account ... @include common-session ... @include common-password
şeklinde ana bloklar var biz kodumuzu @include common-session
bloğunun sonuna ekleyeceğiz.
@include common-auth ... @include common-account ... @include common-session ... session optional pam_exec.so /usr/bin/ssh-login-notify.sh # Standard Un*x password updating. @include common-password
dosyamızın son görüntüsü üsttekine benzer şekilde olacak ve kaydettikten hemen sonra, her bir ssh login işleminde loglama işlemi başlayacaktır.

Buraya kadar loglama işlemi tamamlandı, peki log dosyamızın şişmemesi için ne yapabiliriz?
Linux sistemlerimizde standart olarak gelen logrotate
isminde bir uygulama var ve tam olarak bu işi yapıyor. Burada tek bir konfigürasyon dosyası ile logrotate aracına bizim logları da sıkıştırıp saklamasını söyleyeceğiz,
man logrotate
komutu ile örnek konfigürasyonlara ve detaylı bilgiye erişebilirsiniz, ihtiyacımıza göre bir tane hazırlayalım.
nano /etc/logrotate.d/ssh-logins
/var/log/ssh-login.log { weekly missingok rotate 52 compress notifempty createolddir 750 root adm olddir /var/log/ssh-login-old create 640 root adm }
yukarıdaki dosya logrotate uygulamasına:
- /var/log/ssh-login.log dosyasını,
- Haftalık olarak,
- dosya yoksa hata vermeden,
- ilk kaydı silmeden 52 hafta boyunca,
- dosyayı sıkıştırarak,
- dosya boşsa görmezden gelerek,
- rotate edilen dosyaları taşıyacağın klasör yoksa oluşturarak,
- rotate ettiğin dosyaları ssh-login-old klasörüne taşıyarak,
- dosya izni 640 root kullanıcısı adm grubunda dosyayı oluşturarak rotate işlemini yap.
rotate işlemini yap emirlerini verir. man logrotate
manuelinde gerekli tüm bilgi mevcut durumda.
Bu yazımızda ssh, ssh login işlemi, pam, pam.d, pam_exec, shell scripting, logrotate gibi kavramlar kullanıldı.
Herkese iyi çalışmalar dilerim ve üstte bahsi geçen konuları bilmeden kopyala yapıştır ile iş yapmamanızı tavsiye ederek, bu konular hakkında detaylıca yazılar da hazırlama niyetindeyim. Bu gibi konulara ilginiz varsa eğer, GNU/Linux , Network ve Güvenlik kategorilerimi takip edin derim. Kalın sağlıcakla.
[…] kod web sitemize ait access.log ve rotated access.log.gz dosyalarımızın her birini açıp içerisinde arama yapmama müsaade ediyor. […]