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 ­ Linux­PAM
• 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: Linux­PAM
• 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 typ­modułu znacznik moduł
argumenty
• /etc/pam.d/usługa
typ­moduł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
system­auth:
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=system­auth
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_stack.so service=system­auth
password required /lib/security/pam_stack.so service=system­auth
session required /lib/security/pam_stack.so service=system­auth
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
Linux­PAM
• 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

Podobne dokumenty