Atualmente, estou preparando uma máquina para um serviço de hospedagem, e decidi usar o MySQL para armazenar todos os nossos usuários (já que o resto de nossos serviços já o utilizam). Para isso, estou usando libnss-mysql e pam-mysql . No entanto, embora a maior parte da configuração esteja funcionando, estou enfrentando um problema ao tentar alterar a senha de um usuário com passwd
.
No momento, é possível criar um usuário ( INSERT INTO
) e fazer login como esse usuário usando su
. A máquina não solicita uma senha e o acesso ao shell do usuário é fornecido diretamente. No entanto, uma vez que eu estou logado como este usuário, passwd
termina com:
$ passwd myuser
passwd: Authentication token manipulation error
passwd: password unchanged
De acordo com os logs do MySQL, uma consulta é feita quando passwd
é chamado, portanto, a conexão com o MySQL não é um problema. Além disso, quando tento chamar passwd
com um usuário inexistente, recebo um passwd: user 'doesnotexist' does not exist
apropriado. passwd
encontra um usuário, mas não pode modificar suas informações. O arquivo de log auth.log
diz:
pam_unix(passwd:chauthtok): user "myuser" does not exist in /etc/passwd
pam_mysql - option verbose is set to "1"
pam_mysql - pam_sm_chauthtok() called.
pam_mysql - pam_mysql_open_db() called.
pam_mysql - pam_mysql_open_db() returning 0.
pam_mysql - pam_sm_chauthtok() returning 0.
pam_mysql - pam_mysql_release_ctx() called.
pam_mysql - pam_mysql_destroy_ctx() called.
pam_mysql - pam_mysql_close_db() called.
Ao chamar passwd -Sa
para obter o status de todas as contas, a conta myuser
aparece. Além disso, getent passwd
e getent shadow
retornam uma entrada válida para myuser
.
$ passwd -Sa
...
messagebus L 06/28/2014 0 99999 7 -1
mysql L 06/28/2014 0 99999 7 -1
myuser P 01/01/1970 0 99999 7 -1
$ getent passwd myuser
myuser:x:5001:5000:First Last:/home/members/myuser:/bin/bash
$ getent shadow myuser
myuser:$6$...:0:0:99999:7:::0
No entanto, ao solicitar informações antigas sobre myuser
:
$ chage -l myuser
chage: user 'myuser' does not exist in /etc/passwd
Ao todo:
-
su
encontra o usuário e executa um login sem senha em todos os casos (se eu for root, caso contrário, será solicitada uma senha e o erro do token).
-
chage
não consegue encontrar o usuário; parece procurar /etc/passwd
em vez do DB.
-
passwd
encontra o usuário, mas retorna um erro de token ao tentar editá-lo.
Aqui estão algumas amostras de configuração:
/etc/pam.d/common-account
account sufficient pam_unix.so
account required pam_mysql.so config_file=/etc/pam-mysql.conf
/etc/pam.d/common-auth
auth sufficient pam_unix.so nullok_secure
auth required pam_mysql.so config_file=/etc/pam-mysql.conf
/etc/pam.d/common-session
session sufficient pam_unix.so
session required pwam_mysql.so config_file=/etc/pam-mysql.conf
/etc/pam.d/common-passwd
password sufficient pam_unix.so obscure sha512
password required pam_mysql.so config_file=/etc/pam-mysql.conf
/etc/libnss-mysql.cfg
getpwnam SELECT username,'x',(5000+id),5000,CONCAT(firstname, lastname),CONCAT('/home/members/', username),'/bin/bash' \
FROM users \
WHERE username='%1$s' \
LIMIT 1
getpwuid SELECT username,'x',(5000+id),5000,CONCAT(firstname, lastname),CONCAT('/home/members/', username),'/bin/bash' \
FROM users \
WHERE (5000+id)='%1$u' \
LIMIT 1
getspnam SELECT username,password,0,'0','99999','7','-1','-1','0' \
FROM users \
WHERE username='%1$s' \
LIMIT 1
getpwent SELECT username,'x',(5000+id),5000,CONCAT(firstname, lastname),CONCAT('/home/members/', username),'/bin/bash' \
FROM users
getspent SELECT username,password,0,'0','99999','7','-1','-1','0' \
FROM users
getgrnam SELECT '%1$s','members',5000
getgrgid SELECT name,password,'%1$u'
getgrent SELECT 'members','members',5000
memsbygid SELECT username \
FROM users
gidsbymem SELECT 5000
- Meus IDs de usuário começam em 1 no banco de dados, mas devem começar em 5000 para o sistema (5000 + id).
-
/bin/bash
para todos.
- O diretório
$HOME
de myuser
é /home/members/myuser
.
- Todos pertencem ao grupo
members
, cujo GID é de 5.000.
/etc/pam-mysql.conf
users.host = localhost
users.database = mydatabase
users.db_user = root
users.db_passwd = root_password
users.table = users
users.user_column = username
users.password_column = password
users.password_crypt = 1
/etc/nsswitch.conf
passwd: compat mysql
group: compat
shadow: compat mysql
O que eu tentei:
- Definindo uma senha (SHA512 hash,
$6$...
) no banco de dados por myuser
.
- Excluindo a senha primeiro (
passwd -d
): informa que myuser
não pode ser encontrado em /etc/passwd
. O mesmo acontece se eu tentar bloquear a conta ou forçar a expiração da senha.
- Chamando
passwd
da conta raiz, sem alterações.
- Efetuando log a partir de um terminal na máquina (em vez de
su
): recebo o erro de manipulação de token de autenticação e sou enviado de volta ao prompt de login. O mesmo quando tento conectar-me ao SSH (mais os avisos de expiração da senha, que são lógicos).
Para mim, parece que a parte gerenciamento de usuários (conta / sessão?) está corretamente vinculada ao MySQL, mas a parte gerenciamento de senhas parece depender parcialmente de% código%. Eu perdi algo na configuração?