Fragen zum korrekten Einrichten eines Daemon in SysVInit

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
maddes.b
Beiträge: 10
Registriert: 20.07.2007 16:27:32
Wohnort: Ruhrgebiet
Kontaktdaten:

Fragen zum korrekten Einrichten eines Daemon in SysVInit

Beitrag von maddes.b » 21.07.2007 18:13:19

Hallo zusammen,

habe mich die letzten zwei Tage durch alle möglichen Dokus und Foren geschlagen, um den Subversion server "svnserve" in SysVInit meines Debian 4.0 Etch einzubinden.
Insgesamt habe ich es auch geschafft. Aber es sind noch einige spezielle Fragen offen geblieben, die leider nirgends beantwortet wurden.
Meistens werden die Fragen zwar technisch beantwortet, aber keine Tipps zum organisatorischen Umfeld gegeben.
Ich hoffe das hier Leute mit reichlich Erfahrung Ihre Meinung dazu geben können.

Also erstmal pi-mal-Daumen was ich gemacht habe:
  • 1. Gruppe "svnusers" als System-Gruppe angelegt
    2. User "svnowner" als System-User ohne Home-Verzeichnis angelegt und der Gruppe "svnusers" zugeordnet
    3. Gruppe und Berechtigungen für das Verzeichnis des Dienstes entsprechend angepasst
    4. /etc/init.d/skeleton als /etc/init.d/svnserve kopiert, angepasst und ausführbar gemacht (Inhalt siehe unten)
    5. Danach in das SysVInit-System mittels "update-rc.d svnserve defaults" eingefügt
Nun meine organisatorischen Fragen:
  • 1. Sollte man lieber "--chroot" von start-stop-daemon verwenden, anstatt eine Einschränkung durch den Daemon selbst?
    2. Ist "--chuid" ein Ersatz von "--user" und "--group"? Darf man die zusammen benutzen?
    Die man pages dazu waren für mich nicht eindeutig.
    3. In den meisten Texten wurde der User als System-User angelegt?
    Ist dies so korrekt, und welche Auswirkung hat das eigentlich genau?
    Bzw. wie genau sollte man ein technischen User für einen Daemon / Dienst anlegen?
Und dann zwei Fragen zum Header des Init-Skriptes:
  • 1. Was sollte noch bei "Required-Start" / "Required-Stop" angegeben werden?
    Ich vermute das bei mir $local_fs alleine schon ausreichend wäre.
    2. Was sollte noch bei "Default-Start" / "Default-Stop" angegeben werden?
    Ich vermute das es sich hier um den Debian-Standard handelt und nicht angepasst werden muss. Habe ja auch defaults bei update-rc.d verwendet.
Jede Info ist herzlich willkommen.

Gruss
Maddes
Debian Subversion Infos auf meiner Homepage

/etc/init.d/svnserve:

Code: Alles auswählen

#! /bin/sh
### BEGIN INIT INFO
# Provides:          Subversion Repository Server Daemon
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
#
# Requirements:      /var/run/svnserve/ with "<user>:nogroup"
#
# Short-Description: Initscript for Subversion Repository Server Daemon
# Description:       Written for Debian 4.0 (Etch) to start/stop Subversion Repository Server Daemon
#                    Used skeleton script of 4.0 (Etch).
#
#                    There are some specialities:
#                    1. A special SVN user and group is used and stated with
#                       "--chuid <user>:<group>" (start-stop-daemon).
#                       Plus a fitting "--umask 002" (start-stop-daemon).
#                    2. Make sure that the SVN user can write the pid file to
#                       "/var/run/svnserve/" by setting it to "<user>:nogroup".
#                       Otherwise svnserve will not start.
#                    3. The variable definition of PIDFILE has been moved before
#                       DAEMON_ARGS, as it is used as an argument for svnserve.
### END INIT INFO

# Author: Maddes - http://www.maddes.net/
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Subversion Repository Server Daemon"
NAME=svnserve
PIDFILE=/var/run/svnserve/$NAME.pid
DAEMON=/usr/bin/$NAME
DAEMON_ARGS="--daemon --pid-file ${PIDFILE} --root=/data/svn/"
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --chuid svnowner:svnusers --umask 002 --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
		|| return 1
	start-stop-daemon --chuid svnowner:svnusers --umask 002 --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.
}

... Rest des Skriptes wurde nicht angepasst und entspricht dem Skeleton von Debian 4.0 Etch ...

Zuletzt geändert von maddes.b am 13.08.2007 15:19:17, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.07.2007 19:02:39

maddes.b hat geschrieben: 1. Sollte man lieber "--chroot" von start-stop-daemon verwenden, anstatt eine Einschränkung durch den Daemon selbst?
wenn du sehr "paranoid" bist, wenn es um Sicherheit geht, könntest du dir das überlegen, da dein Daemon aber über keine root-Rechte verfügt, sondern unter einem eigenen User lauft, macht das nicht sehr viel Sinn.
( ein chroot-System muß auch erstmal eingerichtet und gewartet werden )
maddes.b hat geschrieben: 2. Ist "--chuid" ein Ersatz von "--user" und "--group"? Darf man die zusammen benutzen?
Die man pages dazu waren für mich nicht eindeutig.
so wie ich die manpages interpretire, ist "--chuid" ein Ersatz für "--user" und "--group", letztere dürften zugunsten von "--chuid" ignoriert werden

Code: Alles auswählen

root@gms4:~# start-stop-daemon --user 0 --group 0 --chuid 1000:100 --user 0 --group 0 --start --exec /bin/sleep 10 &
[3] 22824
[2]   Done                    start-stop-daemon --user 0 --group 0 --chuid 1000:100 --user 0 --group 0 --start --exec /bin/sleep 10
root@gms4:~#
root@gms4:~# ps -ef | grep sleep
gms  22824 22250  0 18:56 pts/1    00:00:00 /bin/sleep 10
root     22826 22250  0 18:56 pts/1    00:00:00 grep sleep
maddes.b hat geschrieben:3. In den meisten Texten wurde der User als System-User angelegt?
Ist dies so korrekt, und welche Auswirkung hat das eigentlich genau?
Bzw. wie genau sollte man ein technischen User für einen Daemon / Dienst anlegen?
ja, das ist korrekt, aber auch nicht sehr wichtig. Die System-User haben eine UID < 1000 und werden und können daher von Programmen, welche nur die Standard-User anzeigen wollen (z.B: Display-Manager ), von diesen unterschieden werden.

Gruß
gms

maddes.b
Beiträge: 10
Registriert: 20.07.2007 16:27:32
Wohnort: Ruhrgebiet
Kontaktdaten:

Beitrag von maddes.b » 13.08.2007 15:28:54

Subversion unterstützt den nicht dokumentierten parameter "--pid-file" schon seit längerem, ist aber nirgends dokumentiert ausser in der Development Mailing List. Damit entfällt die Verwendung von "--foreground" bei svnserve und "--make-pidfile --background" bei start-stop-daemon.

Da aber nun svnserve (also der Benutzer svnowner) die .pid Datei schreibt, gibt es nun ein Berechtigungsproblem mit dem Verzeichnis /var/run welches normalerweise "root:root" ist.
Um dieses Problem zu lösen legt man ein Unterverzeichnis für den Dienst an und setzt den Owner auf den Benutzer des Dienstes.
Als Gruppe nimmt man "nogroup" oder "root" oder eine andere relevante Gruppe (bei svnserve z.B. svnusers), je nachdem wer dort noch reinschreiben soll/darf.

Code: Alles auswählen

mkdir /var/run/svnserve
chown svnowner:nogroup /var/run/svnserve
Das Script im ersten Posting wurde entsprechend aktualisiert.

Antworten