Skip to content

Commit 48e23d2

Browse files
committed
Fix
1 parent 082702e commit 48e23d2

File tree

4 files changed

+19
-12
lines changed

4 files changed

+19
-12
lines changed

src/middlewared/middlewared/plugins/directoryservices_/activedirectory_join_mixin.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
gss_get_current_cred,
1919
kerberos_ticket,
2020
)
21-
from middlewared.utils.directoryservices.krb5_constants import krb5ccache
21+
from middlewared.utils.directoryservices.krb5_constants import krb5ccache, SAMBA_KEYTAB_DIR
2222
from middlewared.utils.directoryservices.krb5_error import (
2323
KRB5Error,
2424
KRB5ErrCode,
@@ -54,7 +54,7 @@ def _ad_activate(self, perform_kinit=True) -> None:
5454
# that a call to kerberos.start would fail due to lack of replication.
5555
if perform_kinit and not self.__ad_has_tkt_principal():
5656
self.logger.debug('No ticket detected for domain. Starting kerberos service.')
57-
self.middleware.call_sync('kerberos.start')
57+
self._ad_wait_kerberos_start()
5858

5959
def _ad_wait_wbclient(self) -> None:
6060
waited = 0
@@ -157,13 +157,17 @@ def _ad_lookup_dc(self, domain: str, retry: bool = True) -> dict:
157157

158158
def _ad_leave(self, job: Job, ds_type: DSType, domain: str):
159159
""" Delete our computer object from active directory """
160+
161+
# remove all samba keytabs
162+
for file in os.listdir(SAMBA_KEYTAB_DIR):
163+
os.unlink(os.path.join(SAMBA_KEYTAB_DIR, file))
164+
160165
username = str(gss_get_current_cred(krb5ccache.SYSTEM.value).name)
161166

162167
netads = subprocess.run([
163168
SMBCmd.NET.value,
164169
'--use-kerberos', 'required',
165170
'--use-krb5-ccache', krb5ccache.SYSTEM.value,
166-
'-U', username,
167171
'ads', 'leave',
168172
], check=False, capture_output=True)
169173

@@ -185,10 +189,8 @@ def setspn(spn):
185189

186190
netads = subprocess.run(cmd, check=False, capture_output=True)
187191
if netads.returncode != 0:
188-
raise CallError(
189-
'Failed to set spn entry: '
190-
f'{netads.stdout.decode().strip()}'
191-
)
192+
self.logger.error("%s: failed to set spn entry: %s", spn,
193+
netads.stdout.decode().strip())
192194

193195
setspn(f'nfs/{netbiosname.upper()}')
194196
setspn(f'nfs/{netbiosname.upper()}.{domainname.lower()}')
@@ -202,7 +204,6 @@ def _ad_test_join(self, ds_type: DSType, domain: str):
202204
netads = subprocess.run([
203205
SMBCmd.NET.value,
204206
'--use-kerberos', 'required',
205-
'--use-krb5-ccache', krb5ccache.SYSTEM.value,
206207
'--realm', domain,
207208
'-d', '5',
208209
'ads', 'testjoin'

src/middlewared/middlewared/plugins/kerberos.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
)
3636
from middlewared.utils.directoryservices.krb5_conf import KRB5Conf
3737
from middlewared.utils.directoryservices.krb5_error import KRB5Error
38+
from middlewared.utils.io import write_if_changed
3839

3940

4041
class KerberosModel(sa.Model):
@@ -938,19 +939,20 @@ def store_ad_keytab(self):
938939
return
939940

940941
ad = self.middleware.call_sync('activedirectory.config')
941-
keytab_file = base64.b64encode(concatenate_keytab_data(samba_keytabs)).decode()
942+
keytab_file = concatenate_keytab_data(samba_keytabs)
943+
keytab_file_encoded = base64.b64encode(keytab_file).decode()
942944

943945
entry = self.middleware.call_sync('kerberos.keytab.query', [('name', '=', 'AD_MACHINE_ACCOUNT')])
944946
if not entry:
945947
self.middleware.call_sync(
946948
'datastore.insert', self._config.datastore,
947-
{'name': 'AD_MACHINE_ACCOUNT', 'file': keytab_file},
949+
{'name': 'AD_MACHINE_ACCOUNT', 'file': keytab_file_encoded},
948950
{'prefix': self._config.datastore_prefix}
949951
)
950952
else:
951953
self.middleware.call_sync(
952954
'datastore.update', self._config.datastore, entry[0]['id'],
953-
{'name': 'AD_MACHINE_ACCOUNT', 'file': keytab_file},
955+
{'name': 'AD_MACHINE_ACCOUNT', 'file': keytab_file_encoded},
954956
{'prefix': self._config.datastore_prefix}
955957
)
956958

@@ -959,6 +961,8 @@ def store_ad_keytab(self):
959961
'ad_kerberos_principal': f'{ad["netbiosname"]}$@{ad["domainname"]}'
960962
})
961963

964+
write_if_changed(KRB_Keytab.SYSTEM.value, keytab_file, perms=0o600)
965+
962966
@periodic(3600)
963967
@private
964968
async def check_updated_keytab(self):

src/middlewared/middlewared/plugins/smb_/constants.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import enum
22
from middlewared.utils import MIDDLEWARE_RUN_DIR
3+
from middlewared.utils.directoryservices.krb5_constants import SAMBA_KEYTAB_DIR
34

45

56
NETIF_COMPLETE_SENTINEL = f"{MIDDLEWARE_RUN_DIR}/ix-netif-complete"
@@ -75,6 +76,7 @@ class SMBPath(enum.Enum):
7576
SHARECONF = ('/etc/smb4_share.conf', 0o755, False)
7677
STATEDIR = ('/var/db/system/samba4', 0o755, True)
7778
PRIVATEDIR = ('/var/db/system/samba4/private', 0o700, True)
79+
KEYTABDIR = (SAMBA_KEYTAB_DIR, 0o700, True)
7880
LEGACYSTATE = ('/root/samba', 0o755, True)
7981
LEGACYPRIVATE = ('/root/samba/private', 0o700, True)
8082
CACHE_DIR = ('/var/run/samba-cache', 0o755, True)

src/middlewared/middlewared/utils/directoryservices/krb5_constants.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
KRB_TKT_CHECK_INTERVAL = 1800
66
PERSISTENT_KEYRING_PREFIX = 'KEYRING:persistent:'
7-
SAMBA_KEYTAB_DIR = '/etc/samba/keytabs'
7+
SAMBA_KEYTAB_DIR = '/etc/samba/kerberos'
88

99

1010
class KRB_Keytab(enum.Enum):

0 commit comments

Comments
 (0)