Programowanie w systemie Linux
Transkrypt
Programowanie w systemie Linux
Programowanie w systemie Linux Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska Plan • Uwierzytelnienie użytkowników Jacek Lach. Programowanie w systemie Linux • PAM • działanie • administracja • tworzenie aplikacji Jacek Lach. Programowanie w systemie Linux Uwierzytelnienie w oparciu o /etc/passwd struct passwd { char *pw_name; char *pw_passwd; uid_t pw_uid; gid_t pw_gid; char *pw_gecos; char *pw_dir; char *pw_shell; }; • • • • • /* /* /* /* /* /* /* user name */ user password */ user id */ group id */ real name */ home directory */ shell program */ struct passwd *getpwnam(const char *name); struct passwd *getpwuid(uid_t uid); struct passwd *getpwent(void); void setpwent(void); void endpwent(void); Jacek Lach. Programowanie w systemie Linux Plik shadow struct { char char long long long long }; spwd *sp_namp; *sp_pwdp; int sp_lstchg; int sp_min; int sp_max; int sp_warn; /* /* /* /* /* /* Login name. */ Encrypted password. */ Date of last change. */ Minimum number of days btw changes. */ Maximum number of days btw changes. */ Number of days to warn user to change the password. */ long int sp_inact; /* Nr of days the account may be inactive. */ long int sp_expire; /* Nr of days since 1970-01-01 until account expires. */ unsigned long int sp_flag; /* Reserved. */ • struct spwd *getspnam(const char *name); Jacek Lach. Programowanie w systemie Linux Pluggable Authentication Modules LinuxPAM • PAM standard umożliwiający oddzielenie serwera od metody uwierzytelniania użytkowników • PAM został zaprojektowany przez firmę Sun, szkic projektu zawarty jest w RFC 86.0 (Open Group) • Implementacja w systemie Linux: LinuxPAM • Standardowo dostępna w większości dystrybucji Jacek Lach. Programowanie w systemie Linux PAM działanie Biblioteka PAM Aplikacja Funkcja konwersacji Moduły PAM Plik konfiguracyjny PAM PAM działanie Jacek Lach. Programowanie w systemie Linux • PAM mają zdefiniowane standardowe API, za pomocą którego można z nich korzystać • Usługa bezpośrednio korzysta tylko z biblioteki PAM • Biblioteka PAM odczytuje konfigurację usługi na podstawie jej unikalnej nazwy • Moduły PAM ładowane są na żądanie, zgodnie z konfiguracją usługi. Jacek Lach. Programowanie w systemie Linux PAM konfiguracja • /etc/pam.conf usługa typmodułu znacznik moduł argumenty • /etc/pam.d/usługa typmodułu znacznik moduł argumenty PAM typ modułu Jacek Lach. Programowanie w systemie Linux • auth potwierdzenie tożsamości użytkownika, przydział uprawnień • account zarządzanie kontem, działania nie związane z uwierzytelnianiem/autoryzacją • session operacje wykonywane przed / po udostępnieniu usługi użytkownikowi • password aktualizacja tokenu uwierzytelniającego Jacek Lach. Programowanie w systemie Linux PAM znacznik kontrolny • required wymagany jest pozytywny wynik z modułu, nie zatrzymuje przetwarzania kolejnych modułów • requisite wymagany jest pozytywny wynik modułu, przetwarzanie kończone jest natychmiast • sufficient pozytywny wynik wystarczy do uzyskania dostępu • optional wynik nie jest krytyczny dla dostępu do usługi PAM argumenty • debug zapisywanie dodatkowych informacji poprzez syslog Jacek Lach. Programowanie w systemie Linux • no_warn moduł nie przekaże komunikatów do aplikacji • use_first_pass moduł pozyska hasło od wcześniej wykorzystanego modułu • try_first_pass j.w., jeżeli to się nie powiedzie moduł zapyta o hasło • expose_account przekazanie informacji o użytkowniku Jacek Lach. Programowanie w systemie Linux PAM moduły • • • • • • • • pam_unix pam_cracklib pam_deny pam_limits pam_nologin pam_time pam_rootok pam_mysql Jacek Lach. Programowanie w systemie Linux PAM przykład systemauth: auth required /lib/security/pam_env.so auth sufficient /lib/security/pam_unix.so likeauth nullok auth required /lib/security/pam_deny.so account required /lib/security/pam_unix.so password required /lib/security/pam_cracklib.so retry=3 password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow password required /lib/security/pam_deny.so session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so login: auth required /lib/security/pam_securetty.so auth required /lib/security/pam_stack.so service=systemauth auth required /lib/security/pam_nologin.so account required /lib/security/pam_stack.so service=systemauth password required /lib/security/pam_stack.so service=systemauth session required /lib/security/pam_stack.so service=systemauth session optional /lib/security/pam_console.so Jacek Lach. Programowanie w systemie Linux PAM interfejs • Inicjalizacja extern int pam_start(const char *service, const char *user, const struct pam_conv *pam_conversation, pam_handle_t **pamh); • Zakończenie extern int pam_end(pam_handle_t *pamh, int pam_status); Jacek Lach. Programowanie w systemie Linux PAM interfejs • struct pam_conv { int (*conv)(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); void *appdata_ptr; }; • struct pam_response { char *resp; int resp_retcode; }; Jacek Lach. Programowanie w systemie Linux PAM interfejs • struct pam_message { int msg_style; const char *msg; }; • Standard: • #define PAM_PROMPT_ECHO_OFF 1 • #define PAM_PROMPT_ECHO_ON 2 • #define PAM_ERROR_MSG 3 • #define PAM_TEXT_INFO 4 PAM interfejs Jacek Lach. Programowanie w systemie Linux • Uwierzytelnianie użytkownika: extern int pam_authenticate( pam_handle_t *pamh, int flags); PAM_AUTH_ERR PAM_CRED_INSUFFICIENT PAM_AUTHINFO_UNAVAIL PAM_USER_UNKNOWN PAM_MAXTRIES PAM_ABORT Jacek Lach. Programowanie w systemie Linux PAM interfejs • Zarządzanie kontem extern int pam_acct_mgmt( pam_handle_t *pamh, int flags); PAM_NEW_AUTHTOKEN_REQD PAM_ACCT_EXPIRED PAM_AUTH_ERR PAM_PERM_DENIED PAM_USER_UNKNOWN LinuxPAM • Biblioteka funkcji pomocniczych: pam_misc Jacek Lach. Programowanie w systemie Linux • x_strdup(const char *str); • extern int misc_conv(..); • extern time_t pam_misc_conv_warn_time; • extern const char *pam_misc_conv_warn_line; • extern time_t pam_misc_conv_die_time; • extern const char *pam_misc_conv_die_line; • extern int pam_misc_conv_died; Jacek Lach. Programowanie w systemie Linux PAM przykład • sucat