Announcement

Collapse
No announcement yet.

Rechte und andere Geheimnisse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Rechte und andere Geheimnisse

    <P>Hall&ouml;chen,</P>

    <P>ich w&uuml;rde gerne mehr von der Rechten und der Rechtevergabe von Windows NT + Nachfolger wissen. </P>
    <P>Denn alleine wenn man mit Pipes, Dateien und Verzeichnisse arbeitet kommt man mit Rechten in Ber&uuml;hrung. <B>Leider</B> habe ich noch <B>keine entsprechende</B> <B>Literatur</B> gefunden, scheinbar ist es besser man dr&uuml;ckt sich mit irgendwelchen Kr&uuml;cken um den heissen Brei herum.</P>

    <P>K&ouml;nnte mir bitte ein paar Quellen nennen unter der ich die Rechtevergabe besser bzw. &uuml;berhaupt verstehen kann.</P>

    <P>Ich w&uuml;rde halt gerne verstehen warum ich den folgende Text ben&ouml;tige</P>

    <I><P>---------------- Abbeisskante ------------------</P>
    <P>// Security erzeugen</P>
    <P> psd:=Psecurity_Descriptor(localalloc(LPTR,Security _Descriptor_min_Length));</P>

    <P> if not initializesecuritydescriptor(psd,1) then</P>
    <P> begin</P>
    <P> raise Exception.Create('TAplServerTh.Create: Security Descriptor '+#10+#13+</P>
    <P> 'nicht erzeugbar');</P>
    <P> end;</P>
    <P> setsecurityDescriptordacl(psd, True, PACL(NIL), False);</P>
    <P> sa.nlength:=sizeof(sa);</P>
    <P> sa.lpsecuritydescriptor := psd;</P>
    <P> sa.binheritHandle:=true;</P>
    <P>---------------- Abbeisskante ------------------</P>
    </I><B><P> </P>
    <P>Danke f&uuml;r Info's</P>
    <P>Andreas</P></B></BODY>

  • #2
    Hallo,

    willkommen im Klub! Windows NT/2000 stellt sowohl Low-Level-Funktionen als auch High-Level-Funktionen für die Zugriffskontrolle auf Ressourcen bereit. Und die im Beispiel verwendete Win32-API-Funktion <b>InitializeSecurityDescriptor</b> gehört zur ersten Kategorie. Die Low-Level-Funktionen hantieren direkt mit den <i>Security descriptors</i> und den <i>Access-control lists</i> (ACL). Windows NT 3.51 kannte nur diese Low-Level-Funktionen, während aktuelle NT-Versionen ca. 50 Hight-Level-Funktionen (die wesentlich einfacher zu handhaben sind) anbieten.

    Falls man mit den Low-Level-Funktionen hantieren will, wird wohl in jedem Fall die vollständige Win32-SDK-Dokumenation benötigt (also minstestens <b>MSDN Library</b>).

    Der <b>Security Descriptor</b> enthält die sicherheitsrelevanten Informationen über ein schützbares Objekt. Alle benannten Win32-Objekte sind schützbar, so daß davon so ziemlich alles unter NT betroffen ist. Jedes schützbare Objekt kann spezifische und allgemeine Zugriffsrechte verwalten. In diesem Zusammenhang tauchen <b>Security Identifier</b> (SID), <b>Access-control list</b> (ACL), <b>Access-Control Entries</b> (ACEs) und <b>Discretionary Access-Control List</b> (DACL) auf. Als Überbau dokumentiert Microsoft im SDK das <b>Acces-Control Model</b>.

    Ich würde empfehlen, unter diesen Stichworten die umfangreichen Infos im Win32-SDK (Microsoft Platform SDK) durchzulesen. Im SDK tauchen viele Beispielaufrufe (leider in C/C++) auf, die den Einsatz demonstrieren

    Comment


    • #3
      <P>Hallo,
      danke f&uuml;r den Hinweis, aber manchmal sieht man vor lauter B&auml;umen den Wald nicht. Ich habe ja, die MSDN am Rechner liegen, aber nicht unter den ‚Windows Base Services‘ Funktionen nachgesehen.</P>

      <P>Trotzden fehlt mir momentan noch der richtige Einstiegspunkt. Irgendwie ist es mir noch zu abstrakt.
      Vielleicht noch eine kurze Erkl&auml;rung dazu – Sprich wie alles gekommen ist.</P>
      <P>_______________________________________________ __________________________________________</P>

      <P>Ich habe in einem WinNt40(/Win95/Win98)-Peer Netzwerk die Notwendigkeit Daten zwischen Programmen zu transportieren. Wobei es so ist, das die Programme tw. auf dem selben Rechner laufen oder auch auf anderen im Netz. Zweck ist die Anzeige von St&uuml;ckzahlen, Maschinendiagnosen, Werkzeugdiagnosen,... . </P>

      <P>Da die Produkttionslinien 30m und mehr haben k&ouml;nnen, so habe ich so die M&ouml;glichkeit mir die Diagnosedaten von fast jedem beliebigen Rechner der Linien (oder B&uuml;ro) anzuschauen.</P>

      <P>Daher habe ich das ganze mit Pipes gel&ouml;st. Dadurch ist es egal ob ich lokal, oder auf einer anderen Workstation bin.</P>

      <P>&nbsp;</P>
      <P>Nur das mit den Rechten funktioniert nicht so ganz wie ich es mir vorstelle. Ich habe dann etwas fertigen Code eingebaut (das Snippet ist ein Teil davon), damit geht es so leidlich. </P>

      <P>Ich habe auch bei verschiedenen Schulungsinstituten angefragt bez&uuml;glich Kurse oder Referenten, die dieses Thema zumindest in den Grundz&uuml;gen schulen k&ouml;nnen. Jeder hat dann abgewunken.</P>

      <P>Scheint im Zeitalter von TCP/IP mit http+udp+.... kein Thema mehr zu sein – sogar die Pipes haben sich zu Sagenumwobene Mechanismen entwickelt.</P>

      <P>Folgende Code ist eigentlich das Herzst&uuml;ck dieser Kommunikation (Serverseitig)</P>
      ______________________________<br>
      { Plazieren Sie den Thread code hier }<br>
      FCount:= 0;<br>
      fConnected := false;<br>
      while true do begin<br>
      //PipeErzeugung<br>
      FPipe := CreateNamedPipe(PChar(PipeName), PIPE_ACCESS_DUPLEX,<br>
      PIPE_TYPE_Message or PIPE_READMODE_Byte or PIPE_WAIT,<br>
      PIPE_UNLIMITED_INSTANCES, 225, 255,MPWAIT_USE_DEFAULT_WAIT,<br> @sa);<br>
      if (FPipe &lt;&gt; INVALID_HANDLE_VALUE) then<br>
      //Warten auf Clientzugriff<br>
      fConnected := ConnectNamedPipe(FPipe, nil);<br>
      if (fConnected) then begin<br>
      FCount := (Fcount + 1) mod 4;<br>
      //Empfang Clientanfrage<br>
      fSuccess := ReadFile(FPipe, InBC , sizeof(InBC),<br>
      cbBytesRead, Nil);<br>
      //Auswertung der Clientanfrage<br>
      if fSuccess then<br>
      begin<br>
      ProceedQuestion;<br>
      //Antwort zum Client<br>
      WriteFile(FPipe, OutBC, sizeof(OutBC),cbWritten, nil);<br>
      end;<br>
      //Verbindungsabbau<br>
      FlushFileBuffers(FPipe);<br>
      DisconnectNamedPipe(FPipe);<br>
      CloseHandle(FPipe);<br>
      PostMessage(Form1.Handle, WM_ALPSR, FCount,0);<br>
      end;<br>
      end;<br>
      ______________________________<br>

      <P>Und genau hier :

      CreateNamedPipe(PChar(PipeName), PIPE_ACCESS_DUPLEX,
      PIPE_TYPE_Message or PIPE_READMODE_Byte or PIPE_WAIT,
      PIPE_UNLIMITED_INSTANCES, 225, 255, NMPWAIT_USE_DEFAULT_WAIT,@sa);

      Ben&ouml;tige ich den Security-Descriptor – Ich ben&ouml;tige ganz einfach die Rechte, das jeder Client unabh&auml;ngig vom Benutzer diese Pipe verwenden kann. </P>

      <P>Unter den ‚Internet‘ Protokollen ist das ja , soweit ich das &uuml;berblicke, ja kein Problem – da das Securitysystem eigentlich nicht greift.</P>

      <P>Vielleicht kannst Du mir nur einen Tip geben, wie ich das ganze mit ‚Highlevel‘ angehen kann.</P>

      <P>Danke </P>

      <P>Andreas aus Wien</P&gt

      Comment


      • #4
        Hallo,

        der kritische Punkt besteht eigentlich darin, mit welchen Rechten und Privilegion die Prozesse ausgeführt werden, die auf die Named Pipes zugreifen. Denn beim Aufruf von <b>CreateNamedPipe</b> muss man nicht den Security Descriptor ausfüllen, wird hier einfach als letzer Parameter <b>nil</b> übergeben, gelten die Rechte des aufrufenden Prozesses. Da ein Vererben der Handles an Child-Prozesse nicht benötigt wird, könnte man das so machen.

        Nun besteht das Problem nur darin, den Prozess mit den entsprechenden Rechten auszustatten. Da fallen mir spontan zwei Alternativen ein: <br>
        1. Implementierung als NT-Service (Dienst), der unter einem bestimmten Account ausgeführt wird.<br>
        2. Die Anwendung besorgt sich über <b>LogonUser</b> die Rechte eines vordefinierten, gemeinsam für diesen Zweck eingerichteten Benutzers. Wenn alle beteiligten Rechner lokal einen Benutzer mit dem gleichen Benutzernamen und dem gleichen Passwort definieren, sollte das NT-Challange/Response-Verfahren kein Veto mehr einlegen. Die Prozesse müssen dabei allerdings die Privilegien <b>SeTcbPrivilege</b> (SE_TCB_NAME) und <b>SeChangeNotifyPrivilege</b> (SE_CHANGE_NOTIFY_NAME) anfordern.

        Die Interprocess-Kommunikation über Named Pipes, Mailslots etc. tritt angesichts von <b>DCOM</b> immer mehr in den Hintergrund. Denn mit DCOM muss man sich um den ganzen NT-Rechtekram auf dieser Ebene nie mehr beschäftigen

        Comment


        • #5
          <p>Hallo Andreas,</p>

          <p>es ist richtig wie Du den kritischen Punkt beschreibst. Ich
          habe aber den ersten geistigen Knopf bereits früher gehabt, es
          ist mir jetzt klar geworden wie Problembehaftet das ganze in
          einem Peer-Netz ist. Besonders beim Administrieren ist das ein
          Horror. Im MSCE-Kurs ist mir der Knopf dann so richtig
          aufgegangen - zumindest habe ich dann die Ansammlung von Bäumen
          richtig als Wald identifiziert. </p>

          <p>Jeder muss eigentlich auf jeden Arbeitsplatz bekannt sein,
          zumindest mit ein bischen Rechten. Der AUsweg hat mir auch nicht
          gefallen - Den Gast -Account zu öffnen und - da ja im Peernetz -
          von NT die Eigenschaft auszunutzen das der nicht bekannte User
          auf 'Gast' umgelegt wird. Keine elegante Lösung, würde aber zur
          Not auch gehen.</p>

          <p>Es ist klar ich stelle wahrscheinlich auf die
          Internetkomponenten von Delphi um. Damit ist es komplett egal was
          das Security-System vom Windows tut - ich komme durch und vorbei. Denn mit DCOM habe ich ganz einfach noch keine Wissen und Übung. </p>

          <p>Ich bin mir nur noch nicht ganz sicher ob ich direkt auf den
          Socket aufsetzten soll oder auf den Streamkomponenten - ist aber
          bei beiden keine Source zu sehen - und sie haben sich von Version
          zu Version immer wieder geändert.</p>

          <p>In jedeM Fall vielen Dank</p>

          <p>Andi</p>

          <p>&nbsp;</p&gt

          Comment


          • #6
            Hallo,

            mit einem Peer-to-Peer-Netzwerk aus NT-Maschinen hat Du dir auch gleich die schwierigste Umgebung ausgesucht ;-) <br>
            Wenn kein Domain-Controller für die Authentifizierung zuständig ist, läuft jeder NT-Rechner als alleinstehender Server (mit eigener Domäne).

            Die fehlende Erfahrung mit DCOM kann kompensiert werden - es gibt da so ein Buch... ;-

            Comment


            • #7
              Hallo

              Mich würden diese "neuen" 50 High-Level-Funktionen zum Bearbeiten von Security Descriptors und ACLs sehr interessieren. Wo finde ich Informationen darüber?
              Ich finde im MSDN nur die Low-Level-Funktionen, mitwelchen ich mich nun genug lang herumgeschlagen habe ;-)

              Michael Steine

              Comment


              • #8
                Hallo,

                im <b>Microsoft Platform SDK</b> finden sich dazu die folgenden Informationen:
                <i>This overview describes the low-level access-control functions for working with security descriptors and access-control lists (ACLs). Most low-level access-control functions are supported on all versions of Microsoft® Windows NT®/Windows® 2000. The low-level functions for working with object-specific ACEs are supported by Windows 2000 and later.

                The Win32 API also provides a high-level set of access-control functions. For information about when to use each set of functions, see Access-Control Reference. </i>

                Und unter der dort genannten Überschrift <b>Access Control Reference</b> ist die Übersichts-Seite erreichbar, von der aus die Hilfeseite für jede einzelne High-Level-Funktion direkt aufgerufen werden kann

                Comment


                • #9
                  Hallo

                  Ich glaub ich hab nun begriffen welches die High-Level-Funktionen sind. Nun beschäftigt mich jedoch folgendes:

                  Gibt es eine genauere Dokumentation über die ACLs für Verzeichnisse und Dateien unter NT4.0?

                  Die WinAPI erlaubt sehr exakte Bestimmung der Rechte. In NT4.0 kann man jedoch Fileberechtigungen nicht so exakt bestimmen. Dies führt dazu, dass ich oft die Meldung erhalte, dass die Berechtigungen von einem späteren Betriebssystem (NT5.0) verändert worden seien.
                  Wie setze ich über die API zum Beispiel "Read" oder "No access" für ein Verzeichnis?
                  Dann gibt es bei Verzeichnissen noch die Trennung zwischen Datei und Verzeichniszugriff!

                  Wenn ich die Inheritance in der ACE auf SUB_CONTAINERS_AND_OBJECTS_INHERIT setze, dann kann ich Datei- und Verzeichnisrechte eines Verzeichnis (ja, tönt kompliziert) gemeinsam setzen. Der CACLS.EXE Kommandozeilenbefehl erstellt für dies jedoch ZWEI ACEs !!!

                  Ich suche also eine Dokumentation, die Verzeichnis- und Datei-ACLs unter NT4.0 beschreibt.

                  Danke, Michael Steine

                  Comment

                  Working...
                  X