web-dev-qa-db-fra.com

Aider à adapter Courier-authdaemon initscript

Je pourrais utiliser l’aide pour l’adaptation du script standard courier-authdaemon.

Je dirige un serveur de petite entreprise avec postfix, courrier, mariadb, amavisd-new avec clamav et spamassassin et sasl. Après la mise à niveau vers xenial, j’ai eu des problèmes parce que le programme d’installation refusait de s’authentifier comme auparavant. J'ai appris à googler que c'était le résultat d'un libpam-mysql sérieusement cassé dans xenial. Heureusement, il est possible de s’authentifier auprès de routines d’authentification de courriers dans courier-authdaemon, j’ai donc modifié mon postfix smtpd.conf pour qu’il pointe vers cela. Courier-authdaemon est contrôlé par un initscript (dans /et/init.d) comme suit:

#! /bin/sh -e
#
### BEGIN INIT INFO
# Provides:          courier-authdaemon
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

prefix="/usr"
exec_prefix=${prefix}
sysconfdir="/etc/courier"
sbindir="${exec_prefix}/sbin"
daemonscript="${sbindir}/authdaemond"
rundir_courier="/var/run/courier"
rundir="/var/run/courier/authdaemon"
pidfile="${rundir}/pid"

. /lib/lsb/init-functions

# Check for a leftover init script
if [ ! -x $daemonscript ]; then
    exit 0
fi

case "$1" in
start)
    # Start daemon.
    cd /
    log_daemon_msg "Starting Courier authentication services" "authdaemond"
    if [ ! -d "$rundir_courier" ]; then
        mkdir -m 0775 $rundir_courier
        chown daemon:daemon $rundir_courier
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_courier
    fi
    if [ ! -d "$rundir" ]; then
        mkdir -m 0750 $rundir 
        chown daemon:daemon $rundir
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir
    fi
    $daemonscript start
    log_end_msg 0
    ;;
stop)
    # Stop daemon.
    cd /
    log_daemon_msg "Stopping Courier authentication services" "authdaemond"
    $daemonscript stop
    log_end_msg 0
    ;;
restart|force-reload)
    $0 stop
    $0 start
    ;;
status)
    status_of_proc -p "$pidfile" "" "authdaemond" && exit 0 || exit $?
    ;;
*)
    echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
    exit 2
    ;;
esac
exit 0

Problème suivant: postfix est en cours d’exécution dans une prison chroot, qui ne peut pas accéder au socket standard messier-authdaemon. Alors j'ai trouvé ça:

service courier-authdaemon stop
rm -rf /var/run/courier/authdaemon/ /var/spool/postfix/var/run/courier/authdaemon/
mkdir -p /var/spool/postfix/var/run/courier/authdaemon/
ln -s /var/spool/postfix/var/run/courier/authdaemon/ /var/run/courier/authdaemon
service courier-authdaemon start
postfix reload

Ce qui arrête fondamentalement le démon d’authentification, supprime les anciens éléments du répertoire courant et celui de la prison postfix, puis les reconfigure et établit le lien de l’extérieur vers la prison intérieure du chroot, puis tout redémarre. Qui fonctionne Ce qu’il ne fait pas, c’est de rendre ces modifications permanentes, car après un redémarrage (ou une mise à jour/surclassement du service de messagerie), le service de messagerie configure tout à nouveau, je dois donc rétablir le correctif ci-dessus.

Alors évidemment, j'essayais de savoir si quelqu'un aurait trouvé quelque chose à appliquer au correctif au démarrage. Il s'est avéré qu'il y avait quelqu'un, et il a récrit l'initscript authdaemon comme suit

! /bin/sh -e
#
### BEGIN INIT INFO
# Provides:          courier-authdaemon
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

prefix="/usr"
exec_prefix=${prefix}
sysconfdir="/etc/courier"
sbindir="${exec_prefix}/sbin"
daemonscript="${sbindir}/authdaemond"
rundir_courier="/var/run/courier"
rundir="/var/run/courier/authdaemon"
pidfile="${rundir}/pid"

. /lib/lsb/init-functions

# Check for a leftover init script
if [ ! -x $daemonscript ]; then
    exit 0
fi

#== Postfix chrooted ==#+20131117 <[email protected]>
postfix_check() {
  local PFINIT=/etc/init.d/postfix
  local PFMASTER=/etc/postfix/master.cf
  local PFSMTPD=/etc/postfix/sasl/smtpd.conf

  if [ -s $PFINIT ] && [ -s $PFMASTER ] ; then
    # Use Postfix
    if [ "$(/usr/bin/awk '$1~/^smtp$/ && $8~/smtpd/ {print $5}
             ' $PFMASTER)0" != "n0" ]
    then # chroot: Yes
      if [ -s $PFSMTPD ] && [ "0$(/bin/sed -n \
-e '/^authdaemond_path:/s,.\+:\s*,,p' $PFSMTPD)" = "0$rundir/socket" ] &&
         [ ! -L $rundir ]
      then
        /bin/rm -fr $rundir &&
        /bin/ln -s /var/spool/postfix/$rundir $rundir_courier
      fi
    else # chroot: No
      if [ -L $rundir ] ;then
        /bin/rm -fr $rundir
      fi
    fi # Postfix chrooted ?
  fi # Use Postfix
} # postfix_check()
#-- Postfix chrooted --#

case "$1" in
start)
    # Start daemon.
    cd /
    log_daemon_msg "Starting Courier authentication services" "authdaemond"
    if [ ! -d "$rundir_courier" ]; then
        mkdir -m 0775 $rundir_courier
        chown daemon:daemon $rundir_courier
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_courier
    fi
postfix_check
    if [ ! -d "$rundir" ]; then
        mkdir -m 0750 $rundir 
        chown daemon:daemon $rundir
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir
    fi
    $daemonscript start
    log_end_msg 0
    ;;
stop)
    # Stop daemon.
    cd /
    log_daemon_msg "Stopping Courier authentication services" "authdaemond"
    $daemonscript stop
    log_end_msg 0
    ;;
restart|force-reload)
    $0 stop
    $0 start
    ;;
status)
    status_of_proc -p "$pidfile" "" "authdaemond" && exit 0 || exit $?
    ;;
*)
    echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
    exit 2
    ;;
esac
exit 0

Le problème est le suivant: cela ne semble pas fonctionner et mes compétences en expressions régulières ne me permettent pas de résoudre ce problème. Je soupçonne que cela a à voir avec les emplacements de fichiers, mais je ne suis pas sûr. Y a-t-il quelqu'un qui peut me diriger dans la bonne direction afin que je n'ai pas à me souvenir d'appliquer les commandes après un redémarrage?

3
martin lentink

Le problème est que Xenial 16.04 a cassé sasl PAM et est passé au démarrage de systemd. Le script init.d que vous avez édité pour que courier-authdaemon soit exécuté en mode chrooté ne soit jamais exécuté. J'ai découvert ça à la dure.

Je lance maintenant une configuration similaire à celle que vous utilisez (postfixe chrooté plus authentification contre courrier, alors que j’utilisais auparavant SASL PAM le 14.04 Trusty).

Voici ma configuration actuelle:

  • configurer pour authentifier contre courrier

vi /etc/postfix/sasl/smtpd.conf

#pwcheck_method: saslauthd
#mech_list: plain login
#allow_plaintext: true
pwcheck_method: authdaemond
authdaemond_path: /var/run/courier/authdaemon/socket
mech_list: plain login
log_level: 9
  • créer un script de démarrage pour créer le répertoire chroot et les liens symboliques

vi /etc/systemd/system/courier-authdaemon.sh

#! /bin/sh -e
#
# Starts:          courier-authdaemon

prefix="/usr"
exec_prefix=${prefix}
sysconfdir="/etc/courier"
sbindir="${exec_prefix}/sbin"
daemonscript="${sbindir}/authdaemond"
rundir_courier="/var/run/courier"
rundir="/var/run/courier/authdaemon"
rundir_chroot="/var/spool/postfix/var/run/courier/authdaemon"
pidfile="${rundir}/pid"
/bin/echo "Checkpoint 1 Courier authentication services" "authdaemond" >/log.txt

# Check for a leftover init script
if [ ! -x $daemonscript ]; then
        exit 0
fi
/bin/echo "Checkpoint 2 Courier authentication services" "authdaemond" >>/log.txt

        # Start daemon.
        cd /
        /bin/echo "Starting Courier authentication services" "authdaemond" >>/log.txt
        # RAH 20170123. Change to chroot postfix setup
        if [ ! -d "$rundir_courier" ]; then
                /bin/echo  "making parent location" "authdaemond" >>/log.txt
                /bin/mkdir -m 0775 $rundir_courier
                /bin/chown daemon:daemon $rundir_courier
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_courier
        fi
        # clean up chroot location
        if [ -d "$rundir_chroot" ]; then
                /bin/echo  "Cleaning chroot location" "authdaemond" >>/log.txt
                /bin/rm -rf "$rundir_chroot"
        fi
        # remove traditional directory if it exists
        if [ -L "$rundir" ]; then
                /bin/echo  "Unlinking traditional location" "authdaemond" >>/log.txt
                /usr/bin/unlink "$rundir"
        fi
        if [ -d "$rundir" ]; then
                /bin/echo  "Cleaning traditional location" "authdaemond" >>/log.txt
                /bin/rm -rf "$rundir"
        fi
        # make new chroot location
        if [ ! -d "$rundir_chroot" ]; then
                /bin/echo  "making chroot location" "authdaemond" >>/log.txt
                /bin/mkdir -p "$rundir_chroot"
                # /bin/echo mkdir -p "$rundir_chroot"
                /bin/chown daemon:daemon "$rundir_chroot"
                [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_chroot
        fi
        # link chroot location to the original location
        if [ ! -L "$rundir" ]; then
                /bin/echo  "linking chroot location" "authdaemond" >>/log.txt
                /bin/ln -sn "$rundir_chroot" "$rundir"
                # /bin/echo /bin/ln -sfn "$rundir_chroot" "$rundir"
        fi
#       $daemonscript start

exit 0
  • créer un remplacement pour le démarrage via systemd

    Sudo systemctl edit courier-authdaemon
    
  • modifier le contenu de la substitution systemd pour déclencher le script Shell ci-dessus:

    $ more /etc/systemd/system/courier-authdaemon.service.d/override.conf

    [Service]
    ExecStartPre=/etc/systemd/system/courier-authdaemon.sh
    
1
RayH