Estou recebendo o seguinte erro ao tentar navegar em um compartilhamento do Samba:
session setup failed: NT_STATUS_NO_IMPERSONATION_TOKEN
Minha configuração do Samba para vincular um servidor independente smbd
à configuração MIT Kerberos e OpenLDAP costumava funcionar (definitivamente funcionava com o Ubuntu 20.04, não me lembro se alguma vez funcionou com o Ubuntu 22.04):
<smb.conf>
[global]
# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = EXAMPLE
# The 'auto' setting here configures Samba based on the value of the
# 'security' setting.
server role = auto
# Configure Samba to call out to Kerberos for all authentication. Because we're
# not also configuring a passdb, Samba will look to the system accounts for all
# authorization info (e.g. UIDs, groups, etc.). This setup was taken from
# https://help.ubuntu.com/lts/serverguide/samba-ldap.html.
security = ads
realm = EXAMPLE.COM
kerberos method = dedicated keytab
dedicated keytab file = /etc/samba/smbd.keytab
idmap config * : backend = tdb
idmap config * : range = 20001-30000
idmap config {{ domain | upper }} : backend = rfc2307
idmap config {{ domain | upper }} : range = 10000-20000
Eu poderia então pegar um ticket Kerberos e navegar e/ou montar compartilhamentos Samba, por exemplo:
$ kinit
Password for [email protected]:
$ /usr/bin/smbclient //neatbox.example.com/share --use-kerberos=required --no-pass --directory somepath --command ls
. D 0 Fri May 6 07:10:08 2022
.. D 0 Fri May 6 07:10:08 2022
stuff D 0 Fri May 6 07:10:08 2022
otherstuff D 0 Fri May 6 07:10:13 2022
957134040 blocks of size 1024. 620537476 blocks available
Há muito tempo, porém, isso parou de funcionar (há um ou dois anos; só não tive tempo de sentar e mexer nisso até agora; ser pai é, tipo, muito, sabe?). Agora eu entendo isso:
$ /usr/bin/smbclient //neatbox.example.com/share --use-kerberos=required --no-pass --directory somepath --command ls
session setup failed: NT_STATUS_NO_IMPERSONATION_TOKEN
Passei algumas noites pesquisando agora e acho que algo quebrou ou foi removido no Samba 4.14. Algo sobre PACs, que aparentemente fazem parte dos tickets do Kerberos... de alguma forma? [1, 2, 3] Não sei, não sou especialista em Kerberos; Eu apenas misturo as coisas no teclado até que funcionem, como a maioria das pessoas.
Então aqui está minha pergunta principal: o Samba suporta autenticação via MIT Kerberos e OpenLDAP como costumava fazer, ou agora está obsoleto/sem suporte?
Miscelânea
O smbd
log sempre contém isto, logo após iniciar/reiniciar:
$ sudo systemctl status smbd
...
Dec 24 20:53:29 eddings systemd[1]: Starting Samba SMB Daemon...
Dec 24 20:53:29 eddings smbd[782101]: [2023/12/24 20:53:29.593145, 0] ../../source3/smbd/server.c:1734(main)
Dec 24 20:53:29 eddings smbd[782101]: smbd version 4.15.13-Ubuntu started.
Dec 24 20:53:29 eddings smbd[782101]: Copyright Andrew Tridgell and the Samba Team 1992-2021
Dec 24 20:53:29 eddings systemd[1]: Started Samba SMB Daemon.
Dec 24 20:53:30 eddings smbd[782101]: [2023/12/24 20:53:30.244701, 0] ../../source3/printing/nt_printing.c:233(nt_printing_init)
Dec 24 20:53:30 eddings smbd[782101]: nt_printing_init: error checking published printers: WERR_ACCESS_DENIED
Às vezes, de forma não reproduzível, também acaba com vários destes erros:
Dec 24 11:06:27 eddings smbd[766136]: [2023/12/24 11:06:27.972690, 0] ../../source3/auth/auth_winbind.c:120(check_winbind_security)
Dec 24 11:06:27 eddings smbd[766136]: check_winbind_security: winbindd not running - but required as domain member: NT_STATUS_NO_LOGON_SERVERS
Não tenho certeza se são relevantes, mas as smbclient
falhas não parecem desencadeá-las, então... provavelmente não estão relacionadas.
[1] https://bugzilla.samba.org/show_bug.cgi?id=14901 (tentei as configurações username map script
e local nt token from
lá e não funcionou)
PACs, “certificados de atributos de privilégio”, são uma forma de o KDC anexar informações extras aos tickets Kerberos. Embora normalmente um ticket indique apenas o nome principal e nada mais, o PAC também pode fornecer o SID do Windows, as associações de grupo, o diretório inicial... evitando a necessidade do servidor buscar isso no LDAP ou em algum outro lugar. O DCE e o Active Directory usam PACs em todos os lugares; O MIT/Heimdal Kerberos tradicionalmente não o faz.
O Samba, em versões recentes, reformulou seu suporte Kerberos para fechar várias falhas importantes de segurança. Como parte do retrabalho (talvez uma parte desnecessária, mas que reduziu a complexidade do código), um servidor Samba que faz parte de um domínio do Active Directory requer PACs, enquanto um servidor Samba que não é membro do AD faz o oposto e rejeita completamente os tickets. que possuem PACs (já que tradicionalmente o MIT Kerberos e Heimdal não os usavam).
Portanto, o primeiro problema é que você está usando
security = ads
, mas na verdade não tem ADS. Esta opção ativa o modo "Active Directory" do Samba e exige PACs com informações específicas do AD em tickets Kerberos, que você não pode fornecer, o que leva ao erro "NO_IMPERSONATION_TOKEN".Você não precisa
security = ads
apenas usar o Kerberos com o Samba. Remova-o e use o modo de segurança padrão.O segundo problema é que o que foi dito acima é um pouco mentiroso e recentemente o MIT Kerberos começou a emitir tickets com PACs (para resolver outro problema de segurança relacionado ao S4U)... embora sejam PACs vazios que não possuem nenhum dos atributos AD que o Samba possui.
ads
O modo exigiria (sem SID, sem participação em grupos) – esses PACs existem apenas por causa da assinatura digital que carregam – portanto, eles não atenderão aos requisitos do modo de anúncios do Samba.No entanto, esses PACs vazios ainda são PACs e agora serão rejeitados pelo Samba quando for usado como um servidor independente, com um erro "BAD_TOKEN" ligeiramente diferente. Para resolver isso, você precisará marcar os
cifs/*
principais do Samba como não exigindo um PAC:...e jogue fora todos os tickets em cache que você possa ter para o serviço:
Samba é um conjunto de daemons trabalhando juntos. Por alguns anos, se você estiver executando uma configuração de membro de domínio, o winbindd também deverá estar em execução. Certifique-se de que o smbd e o winbindd estejam em execução. O smbd costumava ter um código substituto para lidar com tarefas que agora são totalmente tratadas pelo winbindd.