harden-doc 3.19 - en to de translation catalogue (28 entries)

en: Developer's Best Practices for OS Security
de: Der gute Umgang von Entwicklern mit der Sicherheit des OS

en: This chapter introduces some best secure coding practices for developers writing Debian packages. If you are really interested in secure coding I recommend you read David Wheeler's <ulink name="Secure Programming for Linux and Unix HOWTO" url="http://www.dwheeler.com/secure-programs/" /> and <ulink name="Secure Coding: Principles and Practices" url="http://www.securecoding.org" /> by Mark G. Graff and Kenneth R. van Wyk (O'Reilly, 2003).
de: Dieses Kapitel handelt von einigen der anerkannten Vorgehensweisen für sicheres Programmieren, wenn Entwickler Pakete für Debian erstellen. Wenn Sie sehr an sicherheitsbewusster Programmierung interessiert sind, sollten Sie David Wheelers <ulink url="http://www.dwheeler.com/secure-programs/" name="Secure Programming for Linux and Unix HOWTO" /> und <ulink url="http://www.securecoding.org" name="Secure Coding: Principles and Practices" /> von Mark G. Graff und Kenneth R. van Wyk (O'Reilly, 2003) lesen.

en: Best practices for security review and design
de: Das richtige Vorgehen für die Nachprüfung der Sicherheit und deren Gestaltung

en: Developers that are packaging software should make a best effort to ensure that the installation of the software, or its use, does not introduce security risks to either the system it is installed on or its users.
de: Entwickler, die Software in Pakete packen, sollten größte Anstrengung darauf verwenden sicherzustellen, dass die Installation der Software und ihre Verwendung keine Sicherheitsrisiken für das System oder seine Benutzer eröffnet.

en: In order to do so, they should make their best to review the source code of the package and detect any flaws that might introduce security bugs before releasing the software or distributing a new version. It is acknowledged that the cost of fixing bugs grows for different stages of its development, so it is easier (and cheaper) to fix bugs when designing than when the software has been deployed and is in maintenance mode (some studies say that the cost in this later phase is <emphasis>sixty</emphasis> times higher). Although there are some tools that try to automatically detect these flaws, developers should strive to learn about the different kind of security flaws in order to understand them and be able to spot them in the code they (or others) have written.
de: Dazu sollten sie vor der Veröffentlichung der Software oder einer neuen Version den Quellcode des Pakets nachprüfen, um Fehler zu finden, die zu Sicherheitslücken führen können. Bekanntermaßen ist der Aufwand für die Fehlerbehebung in verschiedenen Stadien der Entwicklung unterschiedlich. So ist es leichter (und billiger), Fehler während der Entwicklung auszubessern als später, wenn die Software schon herausgegeben wurde und nur noch gewartet wird (einige Studien behaupten, dass die Kosten in dieser Phase <emphasis>60</emphasis> Mal höher sind). Es gibt Hilfsmittel, die versuchen, Fehler automatisch zu entdecken. Entwickler sollten dennoch die verschiedenen Sicherheitsfehler kennen, damit sie sie verstehen und sie so in eigenen (oder fremden) Programmcode entdecken können.

en: The programming bugs which lead to security bugs typically include: <ulink name="buffer overflows" url="http://en.wikipedia.org/wiki/Buffer_overflow" />, format string overflows, heap overflows and integer overflows (in C/C++ programs), temporary <ulink name="symlink race conditions" url="http://en.wikipedia.org/wiki/Symlink_race" /> (in scripts), <ulink name="directory traversal" url="http://en.wikipedia.org/wiki/Directory_traversal" /> and command injection (in servers) and <ulink name="cross-site scripting" url="http://en.wikipedia.org/wiki/Cross_site_scripting" />, and <ulink name="SQL injection bugs" url="http://en.wikipedia.org/wiki/SQL_injection" /> (in the case of web-oriented applications). For a more complete information on security bugs review Fortify's <ulink name="Taxonomy of Software Security Errors" url="http://vulncat.fortifysoftware.com/" />.
de: Programmierfehler, die typischerweise zu Sicherheitsproblemen führen, sind insbesondere: <ulink url="http://de.wikipedia.org/wiki/Puffer%C3%BCberlauf" name="Pufferüberläufe," />, Format-String-Überläufe, Heap-Überläufe und Integer-Überläufe (in C/C++-Programmen), vorübergehende <ulink url="http://de.wikipedia.org/wiki/Symlink-Schwachstelle" name="Symlink-Schwachstellen" /> (in Skripten), <ulink url="http://de.wikipedia.org/wiki/Directory_Traversal" name="Directory Traversal" />, die Einschleusung von Befehlen (auf Servern) und <ulink url="http://de.wikipedia.org/wiki/Cross-Site_Scripting" name="Cross-Site Scripting" /> sowie <ulink url="http://de.wikipedia.org/wiki/SQL-Injektion" name="SQL-Injektionen" /> (bei web-orientierten Anwendungen). Eine ausführliche Liste von Sicherheitsfehlern finden Sie in Fortifys <ulink url="http://vulncat.fortifysoftware.com/" name="Taxonomy of Software Security Errors" />.

en: Some of these issues might not be easy to spot unless you are an expert in the programming language the software uses, but some security problems are easy to detect and fix. For example, finding temporary race conditions due to misuse of temporary directories can easily be done just by running <literal>grep -r "/tmp/" .</literal>. Those calls can be reviewed and replace the hardcoded filenames using temporary directories to calls to either <command>mktemp</command> or <command>tempfile</command> in shell scripts, <citerefentry><refentrytitle>File::Temp</refentrytitle> <manvolnum>3perl</manvolnum></citerefentry> in Perl scripts, or <citerefentry><refentrytitle>tmpfile</refentrytitle> <manvolnum>3</manvolnum></citerefentry> in C/C++.
de: Einige dieser Probleme können Sie nur erkennen, wenn Sie ein Experte in der verwendeten Programmiersprache sind. Aber andere können leicht entdeckt und behoben werden. Zum Beispiel kann eine Symlink-Schwachstelle auf Grund einer falschen Verwendung von temporären Verzeichnissen ohne Weiteres entdeckt werden, indem Sie <literal>grep -r "/tmp/" .</literal> ausführen. Diese Verweise sollten überprüft werden und fest einprogrammierte Dateinamen in temporären Verzeichnissen in Shell-Skripten mit <command>mktemp</command> oder <command>tempfile</command>, in Perl-Skripten mit <citerefentry><refentrytitle>File::Temp</refentrytitle> <manvolnum>3perl</manvolnum></citerefentry> und in C/C++ mit <citerefentry><refentrytitle>tmpfile</refentrytitle> <manvolnum>3</manvolnum></citerefentry> ersetzt werden.

en: There are a set of tools available to assist to the security code review phase. These include <package>rats</package>, <package>flawfinder</package> and <package>pscan</package>. For more information, read the <ulink name="list of tools used by the Debian Security Audit Team" url="http://www.debian.org/security/audit/tools" />.
de: Es stehen Ihnen einige Werkzeuge zur Verfügung, die Sie dabei unterstützen, den Quellcode auf Sicherheitsprobleme hin zu überprüfen. Dazu zählen <package>rats</package>, <package>flawfinder</package> und <package>pscan</package>. Weitere Informationen finden Sie in der <ulink url="http://www.de.debian.org/security/audit/tools" name="Liste der Werkzeuge, die vom Debian-Security-Audit-Team verwendet werden" />.

en: When packaging software developers have to make sure that they follow common security principles, including:
de: Beim Paketieren von Software sollten Entwickler darauf achten, dass sie allgemein anerkannte Sicherheitsprinzipien einhalten. Dazu gehören:

en: The software runs with the minimum privileges it needs:
de: Die Software sollte mit so geringen Rechten wie möglich laufen.

en: The package does install binaries setuid or setgid. <command>Lintian</command> will warn of <ulink name="setuid" url=" http://lintian.debian.org/reports/Tsetuid-binary.html" />, <ulink name="setgid" url="http://lintian.debian.org/reports/Tsetgid-binary.html" /> and <ulink name="setuid and setgid" url="http://lintian.debian.org/reports/Tsetuid-gid-binary.html" /> binaries.
de: Falls das Paket Binaries mit setuid oder setgid enthält, wird <command>Lintian</command> vor <ulink url="http://lintian.debian.org/reports/Tsetuid-binary.html" name="setuid" />-, <ulink url="http://lintian.debian.org/reports/Tsetgid-binary.html" name="setgid" />- und <ulink url="http://lintian.debian.org/reports/Tsetuid-gid-binary.html" name="setuid und setgid" />-Binaries warnen.

en: The daemons the package provide run with a low privilege user (see <xref linkend="bpp-lower-privs" />)
de: Die Daemons, die in einem Paket enthalten sind, sollten mit den Rechten eines Benutzers laufen, der nur geringe Privilegien besitzt (vergleichen Sie  dazu <xref linkend="bpp-lower-privs" />).

en: Programmed (i.e., <command>cron</command>) tasks running in the system do NOT run as root or, if they do, do not implement complex tasks.
de: Automatisierte Aufgaben (also mit <command>cron</command>) sollten NICHT mit Root-Rechten laufen. Zumindest sollten mit Root-Rechten keine komplizierten Aufgaben erledigt werden.

en: If you have to do any of the above make sure the programs that might run with higher privileges have been audited for security bugs. If you are unsure, or need help, contact the <ulink name="Debian Security Audit team" url="http://www.debian.org/security/audit/" />. In the case of setuid/setgid binaries, follow the Debian policy section regarding <ulink name="permissions and owners" url="http://www.debian.org/doc/debian-policy/ch-files.html#s10.9" />
de: Falls Sie diese Prinzipien nicht einhalten können, sollten Sie sichergehen, dass das Programm, das mit umfangreicheren Rechten läuft, auf Sicherheitsprobleme überprüft wurde. Wenn Sie sich nicht sicher sind oder Hilfe benötigen, sollten Sie sich mit dem <ulink url="http://www.de.debian.org/security/audit/" name="Sicherheits-Audit-Team von Debian" /> in Verbindung setzen. Wenn Binaries setuid/setgid verwenden, sollten Sie die Richtlinie von Debian zu <ulink url="http://www.debian.org/doc/debian-policy/ch-files#s10.9" name="Rechten und Besitzern" /> beachten.

en: For more information, specific to secure programming, make sure you read (or point your upstream to) <ulink name="Secure Programming for Linux and Unix HOWTO" url="http://www.dwheeler.com/secure-programs/" /> and the <ulink name="Build Security In" url="https://buildsecurityin.us-cert.gov/portal/" /> portal.
de: Für weitere Informationen, insbesondere hinsichtlich Sicherheitsfragen, sollten Sie das <ulink url="http://www.dwheeler.com/secure-programs/" name="Secure Programming for Linux and Unix HOWTO" /> und das <ulink url="https://buildsecurityin.us-cert.gov/portal/" name="Build Security In" /> Portal lesen (oder den Programmautor darauf hinweisen).

en: Creating users and groups for software daemons
de: Benutzer und Gruppen für Software-Daemons erstellen

en: If your software runs a daemon that does not need root privileges, you need to create a user for it. There are two kind of Debian users that can be used by packages: static uids (assigned by <package>base-passwd</package>, for a list of static users in Debian see <xref linkend="faq-os-users" />) and dynamic uids in the range assigned to system users.
de: Wenn Ihre Software als Daemon läuft, der keine Root-Rechte benötigt, müssen Sie für ihn einen Benutzer erstellen. Es gibt zwei Arten von Benutzern in Debian, die für Pakete verwendet werden können: statische UIDs (werden von <application>base-passwd</application> vergeben, eine Liste der statischen Benutzern in Debian finden Sie bei <xref linkend="faq-os-users" />) und dynamisches UIDs, die in einem zugewiesenen Bereich liegen.

en: In the first case, you need to ask for a user or group id to the <package>base-passwd</package>. Once the user is available there the package needs to be distributed including a proper versioned depends to the <package>base-passwd</package> package.
de: Im ersten Fall müssen Sie mit <application>base-passwd</application> eine Benutzer- oder Gruppen-ID erstellen. Wenn der Benutzer verfügbar ist, muss das Paket, das Sie anbieten möchten, eine Abhängigkeit vom Paket <application>base-passwd</application> enthalten.

en: In the second case, you need to create the system user either in the <emphasis>preinst</emphasis> or in the <emphasis>postinst</emphasis> and make the package depend on <literal>adduser (&gt;= 3.11)</literal>.
de: Im zweiten Fall müssen Sie den Systembenutzer entweder <emphasis>preinst</emphasis> oder <emphasis>postinst</emphasis> erstellen und dafür sorgen, dass das Paket von <literal>adduser (>= 3.11)</literal> abhängt.

en: The following example code creates the user and group the daemon will run as when the package is installed or upgraded:
de: Im folgenden Programmbeispiel soll gezeigt werden, wie der Benutzer oder Gruppe, mit deren Rechten der Daemon laufen wird, bei der Installation oder Aktualisierung des Pakets erstellt wird.

en: 
    [...]
    case "$1" in
      install|upgrade)
    
      # If the package has default file it could be sourced, so that
      # the local admin can overwrite the defaults
    
      [ -f "/etc/default/<varname>packagename</varname>" ] &amp;&amp; . /etc/default/<varname>packagename</varname>
    
      # Sane defaults:
    
      [ -z "$SERVER_HOME" ] &amp;&amp; SERVER_HOME=<varname>server_dir</varname>
      [ -z "$SERVER_USER" ] &amp;&amp; SERVER_USER=<varname>server_user</varname>
      [ -z "$SERVER_NAME" ] &amp;&amp; SERVER_NAME="<varname>Server description</varname>"
      [ -z "$SERVER_GROUP" ] &amp;&amp; SERVER_GROUP=<varname>server_group</varname>
    
      # Groups that the user will be added to, if undefined, then none.
      ADDGROUP=""
    
      # create user to avoid running server as root
      # 1. create group if not existing
      if ! getent group | grep -q "^$SERVER_GROUP:" ; then
         echo -n "Adding group $SERVER_GROUP.."
         addgroup --quiet --system $SERVER_GROUP 2&gt;/dev/null ||true
         echo "..done"
      fi
      # 2. create homedir if not existing
      test -d $SERVER_HOME || mkdir $SERVER_HOME
      # 3. create user if not existing
      if ! getent passwd | grep -q "^$SERVER_USER:"; then
        echo -n "Adding system user $SERVER_USER.."
        adduser --quiet \
                --system \
                --ingroup $SERVER_GROUP \
                --no-create-home \
                --disabled-password \
                $SERVER_USER 2&gt;/dev/null || true
        echo "..done"
      fi
      # 4. adjust passwd entry
      usermod -c "$SERVER_NAME" \
              -d $SERVER_HOME   \
              -g $SERVER_GROUP  \
                 $SERVER_USER
      # 5. adjust file and directory permissions
      if ! dpkg-statoverride --list $SERVER_HOME &gt;/dev/null
      then
          chown -R $SERVER_USER:adm $SERVER_HOME
          chmod u=rwx,g=rxs,o= $SERVER_HOME
      fi
      # 6. Add the user to the ADDGROUP group
      if test -n $ADDGROUP
      then
          if ! groups $SERVER_USER | cut -d: -f2 | \
             grep -qw $ADDGROUP; then
               adduser $SERVER_USER $ADDGROUP
          fi
      fi
      ;;
      configure)
    
    [...]
de: 
    [...]
    case "$1" in
      install|upgrade)
    
      # If the package has default file it could be sourced, so that
      # the local admin can overwrite the defaults
    
      [ -f "/etc/default/<varname>packagename</varname>" ] &#38;&#38; . /etc/default/<varname>packagename</varname>
    
      # Sane defaults:
    
      [ -z "$SERVER_HOME" ] &#38;&#38; SERVER_HOME=<varname>server_dir</varname>
      [ -z "$SERVER_USER" ] &#38;&#38; SERVER_USER=<varname>server_user</varname>
      [ -z "$SERVER_NAME" ] &#38;&#38; SERVER_NAME="<varname>Server description</varname>"
      [ -z "$SERVER_GROUP" ] &#38;&#38; SERVER_GROUP=<varname>server_group</varname>
    
      # Groups that the user will be added to, if undefined, then none.
      ADDGROUP=""
    
      # create user to avoid running server as root
      # 1. create group if not existing
      if ! getent group | grep -q "^$SERVER_GROUP:" ; then
         echo -n "Adding group $SERVER_GROUP.."
         addgroup --quiet --system $SERVER_GROUP 2>/dev/null ||true
         echo "..done"
      fi
      # 2. create homedir if not existing
      test -d $SERVER_HOME || mkdir $SERVER_HOME
      # 3. create user if not existing
      if ! getent passwd | grep -q "^$SERVER_USER:"; then
        echo -n "Adding system user $SERVER_USER.."
        adduser --quiet \
                --system \
                --ingroup $SERVER_GROUP \
                --no-create-home \
                --disabled-password \
                $SERVER_USER 2>/dev/null || true
        echo "..done"
      fi
      # 4. adjust passwd entry
      usermod -c "$SERVER_NAME" \
              -d $SERVER_HOME   \
              -g $SERVER_GROUP  \
                 $SERVER_USER
      # 5. adjust file and directory permissions
      if ! dpkg-statoverride --list $SERVER_HOME >/dev/null
      then
          chown -R $SERVER_USER:adm $SERVER_HOME
          chmod u=rwx,g=rxs,o= $SERVER_HOME
      fi
      # 6. Add the user to the ADDGROUP group
      if test -n $ADDGROUP
      then
          if ! groups $SERVER_USER | cut -d: -f2 | \
             grep -qw $ADDGROUP; then
               adduser $SERVER_USER $ADDGROUP
          fi
      fi
      ;;
      configure)
    
    [...]

en: You have to make sure that the init.d script file:
de: Außerdem müssen Sie für das init.d-Skript sicherstellen,

en: Starts the daemon dropping privileges: if the software does not do the <citerefentry><refentrytitle>setuid</refentrytitle> <manvolnum>2</manvolnum></citerefentry> or <citerefentry><refentrytitle>seteuid</refentrytitle> <manvolnum>2</manvolnum></citerefentry> call itself, you can use the <literal>--chuid</literal> call of <command>start-stop-daemon</command>.
de: dass der Daemon beim Starten seine Rechte ablegt: Wenn die Software nicht selbst den <citerefentry><refentrytitle>setuid</refentrytitle> <manvolnum>2</manvolnum></citerefentry> oder <citerefentry><refentrytitle>seteuid</refentrytitle> <manvolnum>2</manvolnum></citerefentry> Aufruf absetzt, sollten Sie die Option <command>--chuid</command> für <application>start-stop-daemon</application> verwenden.

en: Stops the daemon only if the user id matches, you can use the <command>start-stop-daemon</command> <literal>--user</literal> option for this.
de: dass der Daemon nur angehalten wird, wenn die Benutzer-IDs übereinstimmen. Dafür ist die Option <literal>--user</literal> von <command>start-stop-daemon</command> hilfreich.

en: Does not run if either the user or the group do not exist:
de: dass der Daemon nicht gestartet wird, wenn sein Benutzer oder Gruppe nicht existiert:

en: 
      if ! getent passwd | grep -q "^<varname>server_user</varname>:"; then
         echo "Server user does not exist. Aborting" &gt;&amp;2
         exit 1
      fi
      if ! getent group | grep -q "^<varname>server_group</varname>:" ; then
         echo "Server group does not exist. Aborting" &gt;&amp;2
         exit 1
      fi
de: 
      if ! getent passwd | grep -q "^<varname>server_user</varname>:"; then
         echo "Server user does not exist. Aborting" >&#38;2
         exit 1
      fi
      if ! getent group | grep -q "^<varname>server_group</varname>:" ; then
         echo "Server group does not exist. Aborting" >&#38;2
         exit 1
      fi

en: If the package creates the system user it can remove it when it is purged in its <emphasis>postrm</emphasis>. This has some drawbacks, however. For example, files created by it will be orphaned and might be taken over by a new system user in the future if it is assigned the same uid<footnote><para>Some relevant threads discussing these drawbacks include <ulink url="http://lists.debian.org/debian-mentors/2004/10/msg00338.html" /> and <ulink url="http://lists.debian.org/debian-devel/2004/05/msg01156.html" /></para> </footnote>. Consequently, removing system users on purge is not yet mandatory and depends on the package needs. If unsure, this action could be handled by asking the administrator for the prefered action when the package is installed (i.e. through <command>debconf</command>).
de: Wenn das Paket einen Systembenutzer erstellt, kann er wieder in <emphasis>postrm</emphasis> entfernt werden, wenn das Paket vollständig gelöscht wird (purge). Dabei gibt es allerdings einen Nachteil. Zum Beispiel werden Dateien, die von dem Benutzer des Daemons erstellt wurden, benutzerlos und können später einem neuen Benutzer gehören, dem die gleiche UID zugewiesen wurde <footnote><para>Interessante Diskussionen zu diesem Thema finden sich in <ulink url="http://lists.debian.org/debian-mentors/2004/10/msg00338.html" /> und <ulink url="http://lists.debian.org/debian-devel/2004/05/msg01156.html" />.</para></footnote>. Daher ist nicht zwingend notwendig, dass Benutzer beim vollständigen Löschen eines Pakets entfernt werden. Dies hängt vielmehr vom jeweiligen Paket ab. Im Zweifelsfall sollte der Administrator gefragt werden (mit <command>debconf</command>), was passieren soll, wenn ein Paket gelöscht wird.

en: Running programs with a user with limited privileges makes sure that any security issue will not be able to damage the full system. It also follows the principle of <emphasis>least privilege</emphasis>. Also consider you can limit privileges in programs through other mechanisms besides running as non-root<footnote><para>You can even provide a SELinux policy for it</para></footnote>. For more information, read the <ulink name="Minimize Privileges" url="http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/minimize-privileges.html" /> chapter of the <emphasis>Secure Programming for Linux and Unix HOWTO</emphasis> book.
de: Wenn ein Programm unter einem Benutzer mit beschränkten Rechten läuft, wird sichergestellt, dass Sicherheitsprobleme nicht das gesamte System beschädigen können. Dieses Vorgehen beachtet auch das Prinzip der <emphasis>geringst möglichen Privilegien</emphasis>. Denken Sie daran, dass Sie die Rechte eines Programms auch noch durch andere Methoden als beschränkte Benutzerrechte weiter einschränken können <footnote><para>Sie können sogar eine SELinux-Richtlinie erstellen.</para></footnote>.  Weitere Informationen finden Sie im Abschnitt <ulink url="http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/minimize-privileges.html" name="Minimize Privileges" /> des Buchs <emphasis>Secure Programming for Linux and Unix HOWTO</emphasis>.
