Configure systemd-resolved to use IPA's BIND

IPA installer now instructs systemd-resolved to use IPA's BIND DNS
server as primary DNS server.

Fixes: https://pagure.io/freeipa/issue/8275
Signed-off-by: Christian Heimes <cheimes@redhat.com>
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
This commit is contained in:
Christian Heimes 2020-09-22 13:54:37 +02:00
parent 528c519cb5
commit d12f1b4b39
4 changed files with 53 additions and 11 deletions

View File

@ -388,6 +388,7 @@ class BasePathNamespace:
CERTMONGER = '/usr/sbin/certmonger' CERTMONGER = '/usr/sbin/certmonger'
NETWORK_MANAGER_CONFIG_DIR = '/etc/NetworkManager/conf.d' NETWORK_MANAGER_CONFIG_DIR = '/etc/NetworkManager/conf.d'
NETWORK_MANAGER_IPA_CONF = '/etc/NetworkManager/conf.d/zzz-ipa.conf' NETWORK_MANAGER_IPA_CONF = '/etc/NetworkManager/conf.d/zzz-ipa.conf'
SYSTEMD_RESOLVED_IPA_CONF = '/etc/systemd/resolved.conf.d/zzz-ipa.conf'
IPA_CUSTODIA_CONF_DIR = '/etc/ipa/custodia' IPA_CUSTODIA_CONF_DIR = '/etc/ipa/custodia'
IPA_CUSTODIA_CONF = '/etc/ipa/custodia/custodia.conf' IPA_CUSTODIA_CONF = '/etc/ipa/custodia/custodia.conf'
IPA_CUSTODIA_KEYS = '/etc/ipa/custodia/server.keys' IPA_CUSTODIA_KEYS = '/etc/ipa/custodia/server.keys'

View File

@ -57,7 +57,8 @@ wellknownservices = [
'rpcidmapd', 'pki_tomcatd', 'chronyd', 'domainname', 'rpcidmapd', 'pki_tomcatd', 'chronyd', 'domainname',
'named', 'ods_enforcerd', 'ods_signerd', 'gssproxy', 'named', 'ods_enforcerd', 'ods_signerd', 'gssproxy',
'nfs-utils', 'sssd', 'NetworkManager', 'ipa-custodia', 'nfs-utils', 'sssd', 'NetworkManager', 'ipa-custodia',
'ipa-dnskeysyncd', 'ipa-otpd', 'ipa-ods-exporter' 'ipa-dnskeysyncd', 'ipa-otpd', 'ipa-ods-exporter',
'systemd-resolved',
] ]
# The common ports for these services. This is used to wait for the # The common ports for these services. This is used to wait for the

View File

@ -24,7 +24,9 @@ This module contains default platform-specific implementations of system tasks.
from __future__ import absolute_import from __future__ import absolute_import
import os
import logging import logging
import textwrap
from pkg_resources import parse_version from pkg_resources import parse_version
@ -35,6 +37,17 @@ from ipapython.ipachangeconf import IPAChangeConf
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# TODO: Add other masters as FallbackDNS ?
RESOLVE1_IPA_CONF = textwrap.dedent("""
# auto-generated by IPA installer
[Resolve]
# use local BIND instance
DNS=127.0.0.1
# make local BIND default DNS server, add search suffixes
Domains=~. {searchdomains}
""")
class BaseTaskNamespace: class BaseTaskNamespace:
def restore_context(self, filepath, force=False): def restore_context(self, filepath, force=False):
@ -318,7 +331,21 @@ class BaseTaskNamespace:
:param resolve1_enabled: is systemd-resolved enabled? :param resolve1_enabled: is systemd-resolved enabled?
:param fstore: optional file store for backup :param fstore: optional file store for backup
""" """
raise NotImplementedError if resolve1_enabled:
# break circular import
from ipaplatform.services import knownservices
confd = os.path.dirname(paths.SYSTEMD_RESOLVED_IPA_CONF)
os.makedirs(confd, exist_ok=True)
cfg = RESOLVE1_IPA_CONF.format(
searchdomains=" ".join(searchdomains)
)
with open(paths.SYSTEMD_RESOLVED_IPA_CONF, "w") as f:
os.fchmod(f.fileno(), 0o644)
f.write(cfg)
knownservices["systemd-resolved"].reload_or_restart()
def unconfigure_dns_resolver(self, fstore=None): def unconfigure_dns_resolver(self, fstore=None):
"""Unconfigure global DNS resolver (e.g. /etc/resolv.conf) """Unconfigure global DNS resolver (e.g. /etc/resolv.conf)
@ -328,6 +355,12 @@ class BaseTaskNamespace:
if fstore is not None and fstore.has_file(paths.RESOLV_CONF): if fstore is not None and fstore.has_file(paths.RESOLV_CONF):
fstore.restore_file(paths.RESOLV_CONF) fstore.restore_file(paths.RESOLV_CONF)
if os.path.isfile(paths.SYSTEMD_RESOLVED_IPA_CONF):
# break circular import
from ipaplatform.services import knownservices
os.unlink(paths.SYSTEMD_RESOLVED_IPA_CONF)
knownservices["systemd-resolved"].reload_or_restart()
def configure_pkcs11_modules(self, fstore): def configure_pkcs11_modules(self, fstore):
"""Disable p11-kit modules """Disable p11-kit modules

View File

@ -44,7 +44,6 @@ from subprocess import CalledProcessError
from pyasn1.error import PyAsn1Error from pyasn1.error import PyAsn1Error
from ipapython import directivesetter from ipapython import directivesetter
from ipapython import dnsutil
from ipapython import ipautil from ipapython import ipautil
import ipapython.errors import ipapython.errors
@ -625,6 +624,13 @@ class RedHatTaskNamespace(BaseTaskNamespace):
assert nameservers and isinstance(nameservers, list) assert nameservers and isinstance(nameservers, list)
assert searchdomains and isinstance(searchdomains, list) assert searchdomains and isinstance(searchdomains, list)
super().configure_dns_resolver(
nameservers=nameservers,
searchdomains=searchdomains,
resolve1_enabled=resolve1_enabled,
fstore=fstore
)
# break circular import # break circular import
from ipaplatform.services import knownservices from ipaplatform.services import knownservices
@ -632,7 +638,8 @@ class RedHatTaskNamespace(BaseTaskNamespace):
fstore.backup_file(paths.RESOLV_CONF) fstore.backup_file(paths.RESOLV_CONF)
nm = knownservices['NetworkManager'] nm = knownservices['NetworkManager']
if nm.is_enabled(): nm_enabled = nm.is_enabled()
if nm_enabled:
logger.debug( logger.debug(
"Network Manager is enabled, write %s", "Network Manager is enabled, write %s",
paths.NETWORK_MANAGER_IPA_CONF paths.NETWORK_MANAGER_IPA_CONF
@ -658,11 +665,13 @@ class RedHatTaskNamespace(BaseTaskNamespace):
f.write(cfg) f.write(cfg)
# reload NetworkManager # reload NetworkManager
nm.reload_or_restart() nm.reload_or_restart()
else:
# no NM running, fall back to /etc/resolv.conf if not resolve1_enabled and not nm_enabled:
# no NM running, no systemd-resolved detected
# fall back to /etc/resolv.conf
logger.debug( logger.debug(
"Network Manager is not enabled, write %s directly.", "Neither Network Manager nor systemd-resolved are enabled, "
paths.RESOLV_CONF "write %s directly.", paths.RESOLV_CONF
) )
cfg = [ cfg = [
"# auto-generated by IPA installer", "# auto-generated by IPA installer",
@ -678,12 +687,10 @@ class RedHatTaskNamespace(BaseTaskNamespace):
:param fstore: optional file store for restore :param fstore: optional file store for restore
""" """
super().unconfigure_dns_resolver(fstore=fstore)
# break circular import # break circular import
from ipaplatform.services import knownservices from ipaplatform.services import knownservices
if fstore is not None and fstore.has_file(paths.RESOLV_CONF):
fstore.restore_file(paths.RESOLV_CONF)
nm = knownservices['NetworkManager'] nm = knownservices['NetworkManager']
if os.path.isfile(paths.NETWORK_MANAGER_IPA_CONF): if os.path.isfile(paths.NETWORK_MANAGER_IPA_CONF):
os.unlink(paths.NETWORK_MANAGER_IPA_CONF) os.unlink(paths.NETWORK_MANAGER_IPA_CONF)