PAM senaryolarını RedHat 7.5'te test ediyorum
Pam_succeed_if.so pam modülü, PAM'ın sunduğu en temel koşullu test seviyesi gibi gözüküyor ve benim ihtiyaçlarımı karşılamıyor. Sadece kullanıcı, kullanıcı adı, gid, kabuk, ev, ruser, rhost, tty ve servis alanlarında testler oluşturabilirsiniz.
Benim durumumda 'rhost' alanını temel alarak test etmek istiyorum, ancak modülü hata ayıklama işlemine yerleştirdikten sonra, rhost alanının ayarlanmadığını gördüm.
Amacım , kullanıcı makineye yerel olarak giriş yaptıysa, yalnızca /etc/pam.d/sudo içindeki PAM modülünü çalıştırmaktır . Kullanıcının SSH üzerinden giriş yaptığını tespit edersek, o zaman modülü atlamak istiyorum. Aslında işe yarayacağını düşündüğüm 3 farklı fikir bulmuştum ama hepsi başarısız oldu.
Başarısız olan birkaç çözümü paylaşacağım.
Pam_exec.so kullanarak koşullu giriş
Aşağıdaki pam girişini koşullu olarak atlamak istediğim pam modülünün üstüne eklemek istedim:
auth [success=ok default=1] pam_exec.so /etc/security/deny-ssh-user.sh
/Etc/security/deny-ssh-user.sh içeriği
#!/bin/bash
# Returns 1 if the user is logged in through SSH
# Returns 0 if the user is not logged in through SSH
SSH_SESSION=false
if [ -n "${SSH_CLIENT}" ] || [ -n "${SSH_TTY}" ] || [ -n "${SSH_CONNECTION}" ]; then
SSH_SESSION=true
else
case $(ps -o comm= -p $PPID) in
sshd|*/sshd) SSH_SESSION=true;;
esac
fi
if "${SSH_SESSION}"; then
exit 1
else
exit 0
fi
Pam_exec.so kaynak kodunu https://github.com/linux-pam/linux-pam/blob/master/modules/pam_exec/pam_exec.c adresinde okudum ve şaşırtıcı bir şekilde, HER ZAMAN PAM_SUCCESS döndürür Komut dosyasının çıkış kodunun açıklaması. Ve betiğin pam_exec modülünün PAM_SERVICE_ERR, PAM_SYSTEM_ERR veya PAM_IGNORE döndürmesine neden olmasını sağlayamıyorum.
Pam_access.so kullanarak koşullu giriş
Yine, koşullu olarak atlamak istediğim pam modülünün üstüne aşağıdaki pam girişini ekliyorum
auth [success=ok perm_denied=1] pam_access.so accessfile=/etc/security/ssh-sudo-access.conf noaudit
/Etc/security/ssh-sudo-access.conf içeriği
+:ALL:localhost 127.0.0.1
-:ALL:ALL
Vay, süper temiz değil mi? Yerel olarak giriş yaptıysanız ve geri kalan her şeyi reddederseniz başarıya ulaşırsınız. Peki hayır. Pam_access.so modülü hata ayıklama işlemine sokulduğunda ortaya çıkıyor, uzak ana bilgisayarlara, yalnızca kullanılan uçbirime sahip olduğunu bilmiyor. Böylece pam_access uzaktaki ana bilgisayarlar tarafından erişimi engelleyemiyor.
Sadece PAM modülünü atlayabilmem için hangi kara büyüyü kullanmam gerektiğine karar vermek için kelimenin tam anlamıyla kaynak kodu okuduğu çılgınca bir gündü.
pam_exec.so
Modül gerçekten açıklamaya yazılmalıdır ateşler bir komut dosyası kapalı ve bağımsız olarak her zaman komut dosyası döndürür ne olursa olsun çıkış kodu başarısını dönecektir
auth [success=1] pam_debug.so auth=auth_err
yerine kullanmak yardımcı olabilir ... pam_exec.so ...
. Ve olması gerektiği gibi başarısız olduğunu doğrulayın, böylece yığının doğru yapılandırıldığını bilirsiniz.
PAM_SYSTEM_ERR
komut zaman sıfırdan farklı bir değer döndürür . Belki bu yöntemi tekrar kontrol edebilirsin.