PAM-CONFIG(8)
π PAM-CONFIG(8) π
okay so welcome to the Reference Manual page for pam-config, bestie π this is the part where the system's PAM config files get adjusted, and honestly? it's giving "small tool, big responsibility." let's get into it π¦
β¨ NAME β¨
pam-config β adjusts common PAM config files π
πΈ SYNOPSIS πΈ
pam-config [--debug] [--list-modules] [--service service-name] -a | -c |
-d | -q [-f] [module-name]
pam-config --version
π DESCRIPTION π
pam-config adjusts predefined PAM config files. that's the whole sentence, no cap β¨ it's the little tool that goes in and edits the config files that were already set up for you π«Ά
π₯ OPTIONS π₯
π« COMMON OPTIONS π«
--debugβ prints debug messages π so you can actually see what's going on-f,--forceβ the new configuration gets activated regardless of whether there are other local changes. yeah, it does not care, it's giving main character energy π--list-modulesβ prints a list of all supported modules to stdout π--nullokβ addsnullokto all modules which support this π³οΈ--pam-debugβ addsdebugto all modules which support this π--confdirdirectory β use a custom configuration directory π--initializeβ converts the old config and creates a new one π§--updateβ reads the current config and writes them new π
π¦ MODIFIER OPTIONS π¦
use these to specify the action you want pam-config to apply, bestie. they need to be followed by a supported module option β like, non-negotiable. see the section called "SUPPORTED PAM MODULES" π
-a,--addβ adds options or new PAM modules to the existing PAM configuration files β-c,--createβ creates new PAM configuration files for plain UNIX authentication, overwriting the existing ones β οΈ (yes, overwriting β drama)-d,--deleteβ removes options or PAM modules from the existing PAM configuration files β-q,--queryβ prints a list of types and the corresponding module options for the queried PAM module π--verifyβ does some sanity checks on the current common PAM configuration files β
π SUPPORTED PAM MODULES π
this is the list of modules pam-config supports. they're split into two categories: global and single service modules π
π GLOBAL MODULES π
the global modules get inserted into the common-{account,auth,password,session} files, which are included by the single service files π«
πͺ pam_access
--accessβpam_access, for account access rules--access-debugβ addsdebugto allpam_access.soinvocations--access-nodefgroupβ addsnodefgroupto allpam_access.soinvocations--access-noauditβ addsnoauditto allpam_access.soinvocations--access-accessfile=valueβ addsaccessfile=valueoption topam_access.so--access-fieldsep=valueβ addsfieldsep=valueoption topam_access.so--access-listsep=valueβ addslistsep=valueoption topam_access.so
π‘οΈ pam_apparmor
--apparmorβ enable/disablepam_apparmor.so--apparmor-debugβ addsdebugto allpam_apparmor.soinvocations
πͺ pam_ccreds
--ccredsβ enable/disablepam_ccreds.so
π pam_cracklib
--cracklibβ enable/disablepam_cracklib.so--cracklib-debugβ addsdebugto allpam_cracklib.soinvocations--cracklib-reject_usernameβ addsreject_usernameto allpam_cracklib.soinvocations--cracklib-gecoscheckβ addsgecoscheckto allpam_cracklib.soinvocations--cracklib-enforce_for_rootβ addsenforce_for_rootto allpam_cracklib.soinvocations--cracklib-authtok_type=valueβ addsauthtok_type=valueoption topam_cracklib.so--cracklib-retry=valueβ addsretry=valueoption topam_cracklib.so--cracklib-difok=valueβ addsdifok=valueoption topam_cracklib.so--cracklib-difignore=valueβ addsdifignore=valueoption topam_cracklib.so--cracklib-minlen=valueβ addsminlen=valueoption topam_cracklib.so--cracklib-dcredit=valueβ addsdcredit=valueoption topam_cracklib.so--cracklib-ucredit=valueβ addsucredit=valueoption topam_cracklib.so--cracklib-lcredit=valueβ addslcredit=valueoption topam_cracklib.so--cracklib-ocredit=valueβ addsocredit=valueoption topam_cracklib.so--cracklib-minclass=valueβ addsminclass=valueoption topam_cracklib.so--cracklib-dictpath=valueβ addsdictpath=valueoption topam_cracklib.so--cracklib-maxrepeat=valueβ addsmaxrepeat=valueoption topam_cracklib.so--cracklib-maxsequence=valueβ addsmaxsequence=valueoption topam_cracklib.so--cracklib-maxclassrepeat=valueβ addsmaxclassrepeat=valueoption topam_cracklib.so
ποΈ pam_ecryptfs
--ecryptfsβ enable/disablepam_ecryptfs.so--ecryptfs-unwrapβ addsunwrapto allpam_ecryptfs.soinvocations
π± pam_env
--envβ enable/disablepam_env.so--env-debugβ addsdebugto allpam_env.soinvocations--env-conffile=valueβ addsconffile=valueoption topam_env.so--env-envfile=valueβ addsenvfile=valueoption topam_env.so--env-readenv=valueβ addsreadenv=valueoption topam_env.so
β‘ pam_exec
--execβpam_exec, for password management--exec-debugβ addsdebugto allpam_exec.soinvocations--exec-expose_authtokβ addsexpose_authtokto allpam_exec.soinvocations--exec-seteuidβ addsseteuidto allpam_exec.soinvocations--exec-quietβ addsquietto allpam_exec.soinvocations--exec-log=valueβ addslog=valueoption topam_exec.so--exec-option=valueβ addsoption=valueoption topam_exec.so
β³ pam_faildelay
--faildelayβ enable/disablepam_faildelay.so--faildelay-debugβ addsdebugto allpam_faildelay.soinvocations--faildelay-delay=valueβ addsdelay=valueoption topam_faildelay.so
π« pam_fp
--fpβ enable/disablepam_fp.so--fp-debugβ addsdebugto allpam_fp.soinvocations
π« pam_fprint
--fprintβ enable/disablepam_fprint.so--fprint-debugβ addsdebugto allpam_fprint.soinvocations
π« pam_fprintd
--fprintdβ enable/disablepam_fprintd.so--fprintd-debugβ addsdebugto allpam_fprintd.soinvocations
π pam_fscrypt
--fscryptβ enable/disablepam_fscrypt.so
π pam_gnome_keyring
--gnome_keyringβ enable/disablepam_gnome_keyring.so--gnome_keyring-auto_startβ addsauto_startto allpam_gnome_keyring.soinvocations--gnome_keyring-only_if=valueβ addsonly_if=valueoption topam_gnome_keyring.so
π₯ pam_group
--groupβ enable/disablepam_group.so
π€οΈ pam_himmelblau
--himmelblauβ enable/disablepam_himmelblau.so--himmelblau-debugβ addsdebugto allpam_himmelblau.soinvocations
πͺͺ pam_kanidm
--kanidmβ enable/disablepam_kanidm.so--kanidm-debugβ addsdebugto allpam_kanidm.soinvocations
π« pam_krb5
--krb5β enable/disablepam_krb5.so--krb5-debugβ addsdebugto allpam_krb5.soinvocations--krb5-ignore_unknown_principalsβ addsignore_unknown_principalsto allpam_krb5.soinvocations--krb5-minimum_uid=valueβ addsminimum_uid=valueoption topam_krb5.so
ποΈ pam_kwallet5
--kwallet5β enable/disablepam_kwallet5.so
π°οΈ pam_lastlog2
--lastlog2β enable/disablepam_lastlog2.so--lastlog2-debugβ addsdebugto allpam_lastlog2.soinvocations--lastlog2-silentβ addssilentto allpam_lastlog2.soinvocations--lastlog2-database=valueβ addsdatabase=valueoption topam_lastlog2.so--lastlog2-silent_if=valueβ addssilent_if=valueoption topam_lastlog2.so
π pam_ldap
--ldapβ enable/disablepam_ldap.so--ldap-debugβ addsdebugto allpam_ldap.soinvocations
π pam_limits
--limitsβ enable/disablepam_limits.so--limits-debugβ addsdebugto allpam_limits.soinvocations--limits-change_uidβ addschange_uidto allpam_limits.soinvocations--limits-utmp_earlyβ addsutmp_earlyto allpam_limits.soinvocations--limits-conf=valueβ addsconf=valueoption topam_limits.so
π pam_localuser
--localuserβ enable/disablepam_localuser.so--localuser-debugβ addsdebugto allpam_localuser.soinvocations--localuser-file=valueβ addsfile=valueoption topam_localuser.so
π pam_mkhomedir
--mkhomedirβ enable/disablepam_mkhomedir.so--mkhomedir-debugβ addsdebugto allpam_mkhomedir.soinvocations--mkhomedir-silentβ addssilentto allpam_mkhomedir.soinvocations--mkhomedir-umask=valueβ addsumask=valueoption topam_mkhomedir.so--mkhomedir-skel=valueβ addsskel=valueoption topam_mkhomedir.so
π§ͺ pam_mktemp
--mktempβ enable/disablepam_mktemp.so--mktemp-debugβ addsdebugto allpam_mktemp.soinvocations
π·οΈ pam_nam
--namβ enable/disablepam_nam.so
π pam_passwdqc
--passwdqcβ enable/disablepam_passwdqc.so--passwdqc-ask_oldauthtokβ addsask_oldauthtokto allpam_passwdqc.soinvocations--passwdqc-check_oldauthtokβ addscheck_oldauthtokto allpam_passwdqc.soinvocations--passwdqc-use_first_passβ addsuse_first_passto allpam_passwdqc.soinvocations--passwdqc-use_authtokβ addsuse_authtokto allpam_passwdqc.soinvocations--passwdqc-min=valueβ addsmin=valueoption topam_passwdqc.so--passwdqc-max=valueβ addsmax=valueoption topam_passwdqc.so--passwdqc-passphrase=valueβ addspassphrase=valueoption topam_passwdqc.so--passwdqc-match=valueβ addsmatch=valueoption topam_passwdqc.so--passwdqc-similar=valueβ addssimilar=valueoption topam_passwdqc.so--passwdqc-random=valueβ addsrandom=valueoption topam_passwdqc.so--passwdqc-enforce=valueβ addsenforce=valueoption topam_passwdqc.so--passwdqc-retry=valueβ addsretry=valueoption topam_passwdqc.so
πͺͺ pam_pkcs11
--pkcs11β enable/disablepam_pkcs11.so--pkcs11-debugβ addsdebugto allpam_pkcs11.soinvocations--pkcs11-configfile=valueβ addsconfigfile=valueoption topam_pkcs11.so
π pam_pwcheck
--pwcheckβ enable/disablepam_pwcheck.somodule in the password section--pwcheck-debugβ addsdebugto allpam_pwcheck.soinvocations--pwcheck-nullokβ addsnullokto allpam_pwcheck.soinvocations
okay so we're still deep in OPTIONS and honestly? there's a lot of them π but every single one matters, so let's go, no skipping, we're eating this whole list π
--pwcheck-cracklibβ adds thecrackliboption topam_pwcheck.soβ¨--pwcheck-no_obscure_checksβ addsno_obscure_checkstopam_pwcheck.so--pwcheck-enforce_for_rootβ addsenforce_for_roottopam_pwcheck.soπ₯--pwcheck-cracklib_path=pathβ addscracklib_path=pathtopam_pwcheck.so--pwcheck-maxlen=Nβ addsmaxlen=Ntopam_pwcheck.so--pwcheck-minlen=Nβ addsminlen=Ntopam_pwcheck.so--pwcheck-tries=Nβ addstries=Ntopam_pwcheck.so--pwcheck-remember=Nβ addsremember=Ntopam_pwcheck.so
--pwhistoryβ enables/disablespam_pwhistory.soπ--pwhistory-debugβ addsdebugto allpam_pwhistory.soinvocations--pwhistory-use_authtokβ addsuse_authtokto allpam_pwhistory.soinvocations--pwhistory-enforce_for_rootβ addsenforce_for_rootto allpam_pwhistory.soinvocations--pwhistory-remember=valueβ addsremember=valuetopam_pwhistory.so--pwhistory-retry=valueβ addsretry=valuetopam_pwhistory.so--pwhistory-authtok_type=valueβ addsauthtok_type=valuetopam_pwhistory.so--pwhistory-file=valueβ addsfile=valuetopam_pwhistory.so
--pwqualityβ enables/disablespam_pwquality.soπ¦--pwquality-debugβ addsdebugto allpam_pwquality.soinvocations--pwquality-reject_usernameβ addsreject_usernameto allpam_pwquality.soinvocations--pwquality-gecoscheckβ addsgecoscheckto allpam_pwquality.soinvocations--pwquality-enforce_for_rootβ addsenforce_for_rootto allpam_pwquality.soinvocations--pwquality-local_users_onlyβ addslocal_users_onlyto allpam_pwquality.soinvocations--pwquality-use_authtokβ addsuse_authtokto allpam_pwquality.soinvocations--pwquality-authtok_type=valueβ addsauthtok_type=valuetopam_pwquality.so--pwquality-retry=valueβ addsretry=valuetopam_pwquality.so--pwquality-difok=valueβ addsdifok=valuetopam_pwquality.so--pwquality-minlen=valueβ addsminlen=valuetopam_pwquality.so--pwquality-dcredit=valueβ addsdcredit=valuetopam_pwquality.so--pwquality-ucredit=valueβ addsucredit=valuetopam_pwquality.so--pwquality-lcredit=valueβ addslcredit=valuetopam_pwquality.so--pwquality-ocredit=valueβ addsocredit=valuetopam_pwquality.so--pwquality-minclass=valueβ addsminclass=valuetopam_pwquality.so--pwquality-dictpath=valueβ addsdictpath=valuetopam_pwquality.so--pwquality-maxrepeat=valueβ addsmaxrepeat=valuetopam_pwquality.so--pwquality-maxsequence=valueβ addsmaxsequence=valuetopam_pwquality.so--pwquality-maxclassrepeat=valueβ addsmaxclassrepeat=valuetopam_pwquality.so--pwquality-dictcheck=valueβ addsdictcheck=valuetopam_pwquality.so--pwquality-usercheck=valueβ addsusercheck=valuetopam_pwquality.so--pwquality-enforcing=valueβ addsenforcing=valuetopam_pwquality.so--pwquality-badwords=valueβ addsbadwords=valuetopam_pwquality.so
like, that's the whole password-quality buffet, we love a thorough queen π
--selinuxβ enables/disablespam_selinux.so--selinux-debugβ addsdebugto allpam_selinux.soinvocations--sshβ enables/disablespam_ssh.soπ§--ssh-debugβ addsdebugto allpam_ssh.soinvocations--ssh-nullokβ addsnullokto allpam_ssh.soinvocations--ssh-keyfiles=valueβ addskeyfiles=valuetopam_ssh.so--sssβ enables/disablespam_sss.so--sss-debugβ addsdebugto allpam_sss.soinvocations
--systemdβ enables/disablespam_systemd.soβ--systemd-debugβ addsdebugto allpam_systemd.soinvocations--systemd-kill_session_processes=valueβ addskill_session_processes=valuetopam_systemd.so--systemd-kill_only_users=valueβ addskill_only_users=valuetopam_systemd.so--systemd-kill_exclude_users=valueβ addskill_exclude_users=valuetopam_systemd.so--systemd-controllers=valueβ addscontrollers=valuetopam_systemd.so--systemd-reset_controllers=valueβ addsreset_controllers=valuetopam_systemd.so--systemd_homeβ enables/disablespam_systemd_home.soπΈ--systemd_home-debugβ addsdebugto allpam_systemd_home.soinvocations--systemd_home-suspend=valueβ addssuspend=valuetopam_systemd_home.so
yeah the underscore in --systemd_home is not a typo bestie, that's literally how it's spelled, don't come for me π
--thinkfingerβ enables/disablespam_thinkfinger.so--thinkfinger-debugβ addsdebugto allpam_thinkfinger.soinvocations
--umaskβ addspam_umask.soas an optional session module π--umask-debugβ addsdebugto allpam_umask.soinvocations in session management--umask-silentβ addssilentto allpam_umask.soinvocations in session management--umask-usergroupsβ addsusergroupsto allpam_umask.soinvocations in session management--umask-umask=modeβ addsumask=modetopam_umask.so
note how the first three are session-management girlies specifically, and --umask-umask is just plain module-level π«Ά
--unixβ enables/disablespam_unix.soπ--unix-debugβ addsdebugto allpam_unix.soinvocations--unix-auditβ addsauditto allpam_unix.soinvocations--unix-nodelayβ addsnodelayto allpam_unix.soinvocations--unix-nullokβ addsnullokto allpam_unix.soinvocations--unix-shadowβ addsshadowto allpam_unix.soinvocations--unix-md5β addsmd5to allpam_unix.soinvocations--unix-bigcryptβ addsbigcryptto allpam_unix.soinvocations--unix-sha256β addssha256to allpam_unix.soinvocations--unix-sha512β addssha512to allpam_unix.soinvocations--unix-blowfishβ addsblowfishto allpam_unix.soinvocations--unix-nisβ addsnisto allpam_unix.soinvocations--unix-broken_shadowβ addsbroken_shadowto allpam_unix.soinvocations--unix-use_first_passβ addsuse_first_passto allpam_unix.soinvocations--unix-try_first_passβ addstry_first_passto allpam_unix.soinvocations--unix-authtok_type=valueβ addsauthtok_type=valuetopam_unix.so--unix-remember=valueβ addsremember=valuetopam_unix.so--unix-rounds=valueβ addsrounds=valuetopam_unix.so--unix-minlen=valueβ addsminlen=valuetopam_unix.so
the way pam_unix.so has the most optionsβ¦ main character energy fr fr π
--unix2β usespam_unix2.soas the standard UNIX PAM module π₯--unix2-nullokβ addsnullokto allpam_unix2.soinvocations--unix2-debugβ addsdebugto allpam_unix2.soinvocations--unix2-traceβ addstracetopam_unix2.so--unix2-noneβ adds the optionnonetopam_unix2.so--unix2-call_modules=modules,...β addscall_modules=plus the list of modules topam_unix2.so--unix2-nisdir=pathβ addsnisdir=pathtopam_unix2.so
--winbindβ enables/disablespam_winbind.so--winbind-debugβ addsdebugto allpam_winbind.soinvocations--wtmpdbβ enables/disablespam_wtmpdb.soβ¨--wtmpdb-debugβ addsdebugto allpam_wtmpdb.soinvocations--wtmpdb-silentβ addssilentto allpam_wtmpdb.soinvocations--wtmpdb-database=valueβ addsdatabase=valuetopam_wtmpdb.so--wtmpdb-skip_if=valueβ addsskip_if=valuetopam_wtmpdb.so
π«Ά SINGLE SERVICE MODULES π«Ά
okay so these ones are special β they can only be added to single service files. also peep the section called βUSAGE EXAMPLESβ for the full picture, iykyk π
--ck_connectorβ enables/disablespam_ck_connector.so--ck_connector-debugβ addsdebugto allpam_ck_connector.soinvocations
--cryptpassβ enables/disablespam_cryptpass.so--csyncβ enables/disablespam_csync.soπ¦--csync-use_first_passβ addsuse_first_passto allpam_csync.soinvocations--csync-try_first_passβ addstry_first_passto allpam_csync.soinvocations--csync-soft_try_passβ addssoft_try_passto allpam_csync.soinvocations--csync-nullokβ addsnullokto allpam_csync.soinvocations--csync-debugβ addsdebugto allpam_csync.soinvocations--csync-silentβ addssilentto allpam_csync.soinvocations
--google_authenticatorβ enables/disablespam_google_authenticator.soπβ¨--google_authenticator-noskewadjβ addsnoskewadjto allpam_google_authenticator.soinvocations--google_authenticator-nullokβ addsnullokto allpam_google_authenticator.soinvocations--google_authenticator-secret=valueβ addssecret=valuetopam_google_authenticator.so
--keyinitβ enables/disablespam_keyinit.so--keyinit-debugβ addsdebugto allpam_keyinit.soinvocations--keyinit-forceβ addsforceto allpam_keyinit.soinvocations--keyinit-revokeβ addsrevoketo allpam_keyinit.soinvocations
--lastlogβ enables/disablespam_lastlog.soπ--lastlog-debugβ addsdebugto allpam_lastlog.soinvocations--lastlog-silentβ addssilentto allpam_lastlog.soinvocations--lastlog-neverβ addsneverto allpam_lastlog.soinvocations--lastlog-nodateβ addsnodateto allpam_lastlog.soinvocations--lastlog-nohostβ addsnohostto allpam_lastlog.soinvocations--lastlog-notermβ addsnotermto allpam_lastlog.soinvocations--lastlog-nowtmpβ addsnowtmpto allpam_lastlog.soinvocations
and that's where this part lands, but bestie we are not done, keep scrolling π
okay so we were mid-list, right? picking up exactly where we left off β the per-module option parade marches on π β¨
--lastlog-noupdateβ tacks thenoupdateoption onto every singlepam_lastlog.soinvocation. no cap, all of them.--lastlog-showfailedβ same deal but withshowfailed, added to allpam_lastlog.soinvocations.
--loginuidβ turnspam_loginuid.soon or off. the light switch of the loginuid world π--loginuid-require_auditdβ dropsrequire_auditdinto allpam_loginuid.soinvocations.
--mountβ turnspam_mount.soon or off π₯
--u2fβ turnspam_u2f.soon or off. yes bestie, hardware keys, we love secure π¦--u2f-debugβ addsdebugto allpam_u2f.soinvocations.--u2f-nouserokβ addsnouserokto allpam_u2f.soinvocations.--u2f-openasuserβ addsopenasuserto allpam_u2f.soinvocations.--u2f-alwaysokβ addsalwaysokto allpam_u2f.soinvocations.--u2f-interactiveβ addsinteractiveto allpam_u2f.soinvocations.--u2f-manualβ addsmanualto allpam_u2f.soinvocations.--u2f-cueβ addscueto allpam_u2f.soinvocations.--u2f-nodetectβ addsnodetectto allpam_u2f.soinvocations.--u2f-sshformatβ addssshformatto allpam_u2f.soinvocations.
and now the ones that take a value β these all go straight into pam_u2f.so with the =value glued on, so bring receipts π§
--u2f-debug_file=valueβ addsdebug_file=valuetopam_u2f.so.--u2f-origin=valueβ addsorigin=valuetopam_u2f.so.--u2f-appid=valueβ addsappid=valuetopam_u2f.so.--u2f-authfile=valueβ addsauthfile=valuetopam_u2f.so.--u2f-authpending_file=valueβ addsauthpending_file=valuetopam_u2f.so.--u2f-max_devices=valueβ addsmax_devices=valuetopam_u2f.so.--u2f-prompt=valueβ addsprompt=valuetopam_u2f.so.--u2f-cue_prompt=valueβ addscue_prompt=valuetopam_u2f.so.--u2f-userpresence=valueβ addsuserpresence=valuetopam_u2f.so.--u2f-userverification=valueβ addsuserverification=valuetopam_u2f.so.--u2f-pinverification=valueβ addspinverification=valuetopam_u2f.so.
πΈ NOTES πΈ
okk so this one's actually kind of important β pay attention bestie π
the configuration that pam-config writes for the global service modules gets ignored by the system if the common-{account,auth,password,session} symlinks don't point at the common-{account,auth,password,session}-pc files.
like, the vibe is: write all the config you want, but if those symlinks are pointing somewhere else, the system literally does not care. check your symlinks. iykyk π
β¨ USAGE EXAMPLES β¨
real-world, copy-paste-able, chef's kiss π«Ά
- query the state of
pam_unix.so:
pam-config -q --unix
- enable ldap authentication:
pam-config -a --ldap
- enable
pam_mount.sofor the servicegdm:
pam-config --service gdm -a --mount
- enable
pam_umask.sowhether installed or not, and print debug info during the process:
pam-config --debug -a --force --umask
π SEE ALSO π
the whole friend group, in order π
PAM(8), pam_unix(8), pam_cracklib(8), pam_mkhomedir(8), pam_limits(8), pam_env(8), pam_xauth(8), pam_make(8)
π AUTHOR π
pam-config was written by Thorsten Kukuk <kukuk@thkukuk.de>. iconic, honestly.
and that's a wrap, bestie π this whole page dropped as part of the Reference Manual, dated 07/15/2025, and it lives at PAM-CONFIG(8) β go forth and configure slayfully π β¨
π¦ where this page comes from
- opensuse-leap 16.0: pam-config 2.13+git.20250715-160000.2.2 Β· GPL-2.0-only
- opensuse-leap 16.0: pam-config 2.13+git.20250715-160000.2.2 Β· GPL-2.0-only
- opensuse-leap 16.0: pam-config 2.13+git.20250715-160000.2.2 Β· GPL-2.0-only
- opensuse-leap 16.0: pam-config 2.13+git.20250715-160000.2.2 Β· GPL-2.0-only
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms