Через PAM, конечно же. После сработки pam_unix ставите свой модуль pam_mycoolmodule, который делает действия, ставите required если интересно чтобы отработали следующие модули в цепочке (но при этом все равно будет отказ) или requisite, если нужно, чтобы в случае ошибки отказ возвращался сразу.
Модуль лучше писать самому, а не через pam_exec, особенно если он с паролями работать будет.