# Chroot-Jail für SCP/SFTP erstellen

Diese Anleitung beschreibt die Einrichtung eines SCP-Userjails unter Linux. Getestet wurde diese Anleitung unter CentOS 5.2 (und 5.3 64bit) und einem Windowsclient mit WinSCP.

1\. Zuerst müssen das EPEL-Repo und RPMFusion-Repo nach dieser [Anleitung](https://wiki.magenbrot.net/linux/linux_distributionen/centos-redhat/repositories_und_software_fuer_centos "linux:linux_distributionen:centos-redhat:repositories_und_software_fuer_centos") aktiviert werden.

2\. Jetzt mittels „yum -y install scponly“ die alternative Shell für den SCP-Zugriff installieren.

3\. Folgendes zusätzlich in /etc/shells eintragen:

<div id="bkmrk-%2Fusr%2Fbin%2Fscponly-%2Fus"><div>```
/usr/bin/scponly
/usr/sbin/scponlyc
```

</div></div>4\. ein neues Verzeichnis /usr/local/setup\_chroot anlegen und folgendes Script dort als create\_chroot\_user.sh ablegen. Das Orginal-Script aus dem scponly-RPM hat leider nicht fehlerfrei funktioniert. Ich habe das Script vereinfacht und bereinigt. Das Script nimmt das Password von der Kommandozeile.

<div id="bkmrk-%2Fusr%2Flocal%2Fsetup_chr"><div><dl class="code"><dt>/usr/local/setup\_chroot/create\_chroot\_user.sh</dt><dd>```
<span class="co0">#!/bin/sh                                                                                     </span>
<span class="co0">#                                                                                             </span>
<span class="co0"># 2009 Oliver Voelker <wiki(at)magenbrot.net></span>
<span class="co0">#                                                                                             </span>
<span class="co0"># create an chroot-home                                                                       </span>
<span class="co0">#                                                                                             </span>
 
            <span class="co0"># the following is a list of binaries that will be staged in the target dir</span>
<span class="co0">#BINARIES="/bin/sh /bin/bash /bin/cp /bin/ls /bin/mkdir /bin/mv /bin/pwd /bin/rm /bin/rmdir /usr/bin/id /usr/bin/ssh /bin/ping /usr/bin/dircolors /bin/vi /usr/bin/sftp /usr/libexec/openssh/sftp-server /usr/bin/scp"                                                                                                                                                  </span>
<span class="re2">BINARIES</span>=<span class="st0">"/bin/ls /bin/mkdir /bin/mv /bin/pwd /bin/rm /bin/rmdir /usr/bin/id /usr/bin/sftp /usr/libexec/openssh/sftp-server /usr/bin/scp"</span>                                           
 
<span class="co0"># determine architecture                                                                                                                                                            </span>
<span class="re2">ARCH</span>=<span class="sy0">`</span><span class="kw2">uname</span> -i<span class="sy0">`</span>                                                                                                                                                                     
 
<span class="co0"># a function to display a failure message and then exit                                                                                                                             </span>
fail <span class="br0">(</span> <span class="br0">)</span> <span class="br0">{</span>                                                                                                                                                                          
        <span class="kw3">echo</span> <span class="re5">-e</span> $<span class="sy0">@</span>                                                                                                                                                                  
        <span class="kw3">exit</span> <span class="nu0">1</span>                                                                                                                                                                      
<span class="br0">}</span>                                                                                                                                                                                   
 
<span class="co0"># "get with default" function                                                                                                                                                       </span>
<span class="co0"># this function prompts the user with a query and default reply                                                                                                                     </span>
<span class="co0"># it returns the user reply                                                                                                                                                         </span>
getwd <span class="br0">(</span> <span class="br0">)</span> <span class="br0">{</span>                                                                                                                                                                         
        <span class="re2">query</span>=<span class="st0">"$1"</span>                                                                                                                                                                  
        <span class="re2">default</span>=<span class="st0">"$2"</span>                                                                                                                                                                
        <span class="kw3">echo</span> <span class="re5">-en</span> <span class="st0">"<span class="es2">$query</span> [<span class="es2">$default</span>]"</span> <span class="sy0">|</span> <span class="kw2">cat</span> <span class="sy0">>&</span><span class="nu0">2</span>                                                                                                                                      
        <span class="kw3">read</span> response                                                                                                                                                               
        <span class="kw1">if</span> <span class="br0">[</span> x<span class="re1">$response</span> = <span class="st0">"x"</span> <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                               
                <span class="re2">response</span>=<span class="re1">$default</span>                                                                                                                                                   
        <span class="kw1">fi</span>                                                                                                                                                                          
        <span class="kw3">echo</span> <span class="re1">$response</span>                                                                                                                                                              
<span class="br0">}</span>                                                                                                                                                                                   
 
<span class="co0"># "get yes no" function                                                                                                                                                             </span>
<span class="co0"># this function prompts the user with a query and will continue to do so                                                                                                            </span>
<span class="co0"># until they reply with either "y" or "n"                                                                                                                                           </span>
getyn <span class="br0">(</span> <span class="br0">)</span> <span class="br0">{</span>                                                                                                                                                                         
        <span class="re2">query</span>=<span class="st0">"$@"</span>                                                                                                                                                                  
        <span class="kw3">echo</span> <span class="re5">-en</span> <span class="re1">$query</span> <span class="sy0">|</span> <span class="kw2">cat</span> <span class="sy0">>&</span><span class="nu0">2</span>                                                                                                                                                   
        <span class="kw3">read</span> response                                                                                                                                                               
        <span class="kw1">while</span> <span class="br0">[</span> x<span class="re1">$response</span> <span class="sy0">!</span>= <span class="st0">"xy"</span> <span class="re5">-a</span> x<span class="re1">$response</span> <span class="sy0">!</span>= <span class="st0">"xn"</span> <span class="br0">]</span>; <span class="kw1">do</span>                                                                                                                      
                <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">"<span class="es1">\n</span>'y' or 'n' only please...<span class="es1">\n</span>"</span> <span class="sy0">|</span> <span class="kw2">cat</span> <span class="sy0">>&</span><span class="nu0">2</span>                                                                                                                   
                <span class="kw3">echo</span> <span class="re5">-en</span> <span class="re1">$query</span> <span class="sy0">|</span> <span class="kw2">cat</span> <span class="sy0">>&</span><span class="nu0">2</span>                                                                                                                                           
                <span class="kw3">read</span> response                                                                                                                                                       
        <span class="kw1">done</span>                                                                                                                                                                        
        <span class="kw3">echo</span> <span class="re1">$response</span>                                                                                                                                                              
<span class="br0">}</span>                                                                                                                                                                                   
 
<span class="kw1">if</span> <span class="br0">[</span> x<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">ldd</span> = x <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                                      
        <span class="kw3">echo</span> <span class="st0">"this script requires the program ldd to determine which"</span>                                                                                                              
        fail <span class="st0">"shared libraries to copy into your chrooted dir..."</span>                                                                                                                   
<span class="kw1">fi</span>                                                                                                                                                                                  
<span class="re2">USE_PW</span>=<span class="nu0">1</span>;                                                                                                                                                                           
 
<span class="co0"># we need to be root                                                                                                                                                                </span>
<span class="kw1">if</span> <span class="br0">[</span> <span class="sy0">`</span><span class="kw2">id</span> -u<span class="sy0">`</span> <span class="sy0">!</span>= <span class="st0">"0"</span> <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                                         
        fail <span class="st0">"you must be root to run this script<span class="es1">\n</span>"</span>                                                                                                                                
<span class="kw1">fi</span>                                                                                                                                                                                  
 
<span class="kw1">if</span> <span class="br0">[</span> <span class="st0">"x$2"</span> = <span class="st0">"x"</span> <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                                            
        fail <span class="st0">"Usage: $0 <username> <password>"</span>                                                                                                                                      
<span class="kw1">fi</span>                                                                                                                                                                                  
 
<span class="re2">targetuser</span>=<span class="re4">$1</span>                                                                                                                                                                       
<span class="re2">targetdir</span>=<span class="sy0">/</span>home<span class="sy0">/</span><span class="re1">$targetuser</span>                                                                                                                                                         
 
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span>                                                                                                                                                   
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>dev                                                                                                                                               
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr                                                                                                                                               
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>bin                                                                                                                                           
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>sbin                                                                                                                                          
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span><span class="kw3">local</span>                                                                                                                                         
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>lib                                                                                                                                     
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>bin                                                                                                                                     
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib                                                                                                                                               
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib                                                                                                                                           
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>libexec                                                                                                                                       
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>libexec<span class="sy0">/</span>openssh                                                                                                                               
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>bin                                                                                                                                               
<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc                                                                                                                                               
<span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$ARCH</span> = <span class="st0">"x86_64"</span> <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                                       
  <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib64                                                                                                                                           
  <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib64                                                                                                                                       
<span class="kw1">fi</span>                                                                                                                                                                                  
 
<span class="kw1">for</span> bin <span class="kw1">in</span> <span class="re1">$BINARIES</span>; <span class="kw1">do</span>                                                                                                                                                            
        <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re1">$bin</span> <span class="re1">$targetdir</span><span class="re1">$bin</span>                                                                                                                                     
<span class="kw1">done</span>                                                                                                                                                                                
 
<span class="re2">LIB_LIST</span>=<span class="sy0">`/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">ldd</span> <span class="re1">$BINARIES</span> <span class="nu0">2</span><span class="sy0">></span> <span class="sy0">/</span>dev<span class="sy0">/</span>null <span class="sy0">|</span> <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cut</span> <span class="re5">-f2</span> -d\<span class="sy0">></span> <span class="sy0">|</span> <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cut</span> <span class="re5">-f1</span> -d\<span class="br0">(</span> <span class="sy0">|</span> <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">grep</span> <span class="st0">"^ "</span> <span class="sy0">|</span> <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">sort</span> -u<span class="sy0">`</span>                                                              
 
<span class="re2">LDSOFOUND</span>=<span class="nu0">0</span>                                                                                                                                                                         
<span class="kw1">if</span> <span class="br0">[</span> <span class="re5">-f</span> <span class="sy0">/</span>usr<span class="sy0">/</span>libexec<span class="sy0">/</span>ld.so <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                                  
        <span class="re2">LIB_LIST</span>=<span class="st0">"<span class="es2">$LIB_LIST</span> /usr/libexec ld.so"</span>                                                                                                                                     
        <span class="re2">LDSOFOUND</span>=<span class="nu0">1</span>                                                                                                                                                                 
<span class="kw1">fi</span>                                                                                                                                                                                  
<span class="kw1">if</span> <span class="br0">[</span> <span class="re5">-f</span> <span class="sy0">/</span>lib<span class="sy0">/</span>ld-linux.so.2 <span class="br0">]</span>; <span class="kw1">then</span>                                                                                                                                                  
        <span class="re2">LIB_LIST</span>=<span class="st0">"<span class="es2">$LIB_LIST</span> /lib/ld-linux.so.2"</span>                                                                                                                                     
        <span class="re2">LDSOFOUND</span>=<span class="nu0">1</span>                                                                                                                                                                 
<span class="kw1">fi</span>                                                                                                                                                                                  
 
<span class="co0"># 64bit</span>
<span class="kw1">if</span> <span class="br0">[</span> <span class="re5">-f</span> <span class="sy0">/</span>lib64<span class="sy0">/</span>ld-linux.so.2 <span class="br0">]</span>; <span class="kw1">then</span>
        <span class="re2">LIB_LIST</span>=<span class="st0">"<span class="es2">$LIB_LIST</span> /lib64/ld-linux.so.2"</span>
        <span class="re2">LDSOFOUND</span>=<span class="nu0">1</span>                              
<span class="kw1">fi</span>                                               
 
<span class="kw1">if</span> <span class="br0">[</span> <span class="re5">-f</span> <span class="sy0">/</span>usr<span class="sy0">/</span>libexec<span class="sy0">/</span>ld-elf.so.1 <span class="br0">]</span>; <span class="kw1">then</span>
        <span class="re2">LIB_LIST</span>=<span class="st0">"<span class="es2">$LIB_LIST</span> /usr/libexec/ld-elf.so.1"</span>
        <span class="re2">LDSOFOUND</span>=<span class="nu0">1</span>                                  
<span class="kw1">fi</span>                                                   
 
<span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$LDSOFOUND</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">]</span>; <span class="kw1">then</span>                        
        fail i cant <span class="kw2">find</span> your equivalent of ld.so    
<span class="kw1">fi</span>                                                   
 
<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">ls</span> <span class="sy0">/</span>lib<span class="sy0">/</span>libnss_compat<span class="sy0">*</span> <span class="nu0">2</span><span class="sy0">>&</span><span class="nu0">1</span> <span class="sy0">></span> <span class="sy0">/</span>dev<span class="sy0">/</span>null         
<span class="kw1">if</span> <span class="br0">[</span> <span class="re4">$?</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">]</span>; <span class="kw1">then</span>                                
        <span class="re2">LIB_LIST</span>=<span class="st0">"<span class="es2">$LIB_LIST</span> /lib/libnss_compat* /lib/ld.so"</span>
<span class="kw1">fi</span>                                                         
 
<span class="co0"># 64bit</span>
<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">ls</span> <span class="sy0">/</span>lib64<span class="sy0">/</span>libnss_compat<span class="sy0">*</span> <span class="nu0">2</span><span class="sy0">>&</span><span class="nu0">1</span> <span class="sy0">></span> <span class="sy0">/</span>dev<span class="sy0">/</span>null
<span class="kw1">if</span> <span class="br0">[</span> <span class="re4">$?</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">]</span>; <span class="kw1">then</span>                         
        <span class="re2">LIB_LIST</span>=<span class="st0">"<span class="es2">$LIB_LIST</span> /lib64/libnss_compat* /lib64/ld.so"</span>
<span class="kw1">fi</span>                                                             
 
 
<span class="kw1">if</span> <span class="br0">[</span> <span class="st0">"x<span class="es2">$LIB_LIST</span>"</span> <span class="sy0">!</span>= <span class="st0">"x"</span> <span class="br0">]</span>; <span class="kw1">then</span>
        <span class="kw1">for</span> lib <span class="kw1">in</span> <span class="re1">$LIB_LIST</span>; <span class="kw1">do</span>
                <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re1">$lib</span> <span class="re1">$targetdir</span><span class="sy0">/</span><span class="re1">$lib</span>
        <span class="kw1">done</span>                                            
<span class="kw1">fi</span>                                                      
<span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$USE_PW</span> <span class="re5">-eq</span> <span class="nu0">0</span> <span class="br0">]</span> ; <span class="kw1">then</span>                             
    <span class="sy0">/</span>usr<span class="sy0">/</span>sbin<span class="sy0">/</span>useradd <span class="re5">-d</span> <span class="st0">"<span class="es2">$targetdir</span>//store"</span> <span class="re5">-s</span> <span class="st0">"/usr/sbin/scponlyc"</span> <span class="re1">$targetuser</span>
    <span class="kw1">if</span> <span class="br0">[</span> <span class="re4">$?</span> <span class="re5">-ne</span> <span class="nu0">0</span> <span class="br0">]</span>; <span class="kw1">then</span>                                                       
         fail <span class="st0">"if this user exists, remove it and try again"</span>                    
    <span class="kw1">fi</span>                                                                          
<span class="kw1">else</span>                                                                            
     useradd <span class="re5">-n</span> <span class="re1">$targetuser</span> <span class="re5">-s</span> <span class="st0">"/usr/sbin/scponlyc"</span> <span class="re5">-d</span> <span class="st0">"<span class="es2">$targetdir</span>//store"</span>      
    <span class="kw1">if</span> <span class="br0">[</span> <span class="re4">$?</span> <span class="re5">-ne</span> <span class="nu0">0</span> <span class="br0">]</span>; <span class="kw1">then</span>                                                       
         fail <span class="st0">"if this user exists, remove it and try again"</span>                    
    <span class="kw1">fi</span>                                                                          
<span class="kw1">fi</span>                                                                              
 
<span class="kw2">chown</span> <span class="nu0">0</span>:<span class="nu0">0</span> <span class="re1">$targetdir</span>                                                            
<span class="kw1">if</span> <span class="br0">[</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>.ssh <span class="br0">]</span>; <span class="kw1">then</span>                                                 
        <span class="kw2">chown</span> <span class="nu0">0.0</span> <span class="re1">$targetdir</span><span class="sy0">/</span>.ssh                                               
<span class="kw1">fi</span>                                                                              
 
<span class="kw1">if</span> <span class="br0">[</span> <span class="sy0">!</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">//</span>store <span class="br0">]</span>; <span class="kw1">then</span>                                             
        <span class="kw3">echo</span> <span class="re5">-e</span> <span class="st0">"<span class="es1">\n</span>creating  <span class="es2">$targetdir</span>/store directory for uploading files"</span>    
        <span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">install</span> <span class="re5">-c</span> <span class="re5">-o</span> <span class="re1">$targetuser</span> <span class="re5">-d</span> <span class="re1">$targetdir</span><span class="sy0">/</span>store                  
<span class="kw1">fi</span>                                                                              
 
<span class="co0"># the following is VERY BSD centric</span>
<span class="co0"># i check for pwd_mkdb before trying to use it</span>
<span class="kw1">if</span> <span class="br0">[</span> x = x <span class="br0">]</span>; <span class="kw1">then</span>
        <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">grep</span> <span class="re1">$targetuser</span> <span class="sy0">/</span>etc<span class="sy0">/</span><span class="kw2">passwd</span> <span class="sy0">></span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span><span class="kw2">passwd</span>
<span class="kw1">else</span>
        <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">grep</span> <span class="re1">$targetuser</span> <span class="sy0">/</span>etc<span class="sy0">/</span>master.passwd <span class="sy0">></span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>master.passwd <span class="re5">-d</span> <span class="st0">"<span class="es2">$targetdir</span>/etc"</span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>master.passwd
        <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">rm</span> <span class="re5">-rf</span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>master.passwd <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>spwd.db
<span class="kw1">fi</span>
 
<span class="kw2">rm</span> <span class="re5">-f</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">groups</span>
<span class="co0">#gcc groups.c -o groups</span>
<span class="kw2">cp</span> <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>setup_chroot<span class="sy0">/</span><span class="kw2">groups</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">groups</span>
 
<span class="kw2">cp</span> <span class="sy0">/</span>usr<span class="sy0">/</span>local<span class="sy0">/</span>setup_chroot<span class="sy0">/</span>ld.so.conf <span class="re1">$targetdir</span><span class="sy0">/</span>etc
<span class="kw2">cp</span> <span class="sy0">/</span>lib<span class="sy0">/</span>libnss_files.so.2 <span class="re1">$targetdir</span><span class="sy0">/</span>lib
 
<span class="kw2">mknod</span> <span class="re1">$targetdir</span><span class="sy0">/</span>dev<span class="sy0">/</span>null c <span class="nu0">1</span> <span class="nu0">3</span>
<span class="kw2">chmod</span> <span class="nu0">666</span> <span class="re1">$targetdir</span><span class="sy0">/</span>dev<span class="sy0">/</span>null
 
<span class="re2">targetuid</span>=<span class="sy0">`</span><span class="kw2">id</span> <span class="re5">-u</span> <span class="re1">$targetuser</span><span class="sy0">`</span>
<span class="re2">targetgid</span>=<span class="sy0">`</span><span class="kw2">id</span> <span class="re5">-g</span> <span class="re1">$targetuser</span><span class="sy0">`</span>
<span class="kw2">cat</span> <span class="sy0">/</span>etc<span class="sy0">/</span><span class="kw2">passwd</span> <span class="sy0">|</span> <span class="kw2">awk</span> <span class="re5">-F</span><span class="st0">":"</span> <span class="st_h">'{if($3==0){print $0}}'</span> <span class="sy0">></span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span><span class="kw2">passwd</span>
<span class="co0">#winscp seems to work bad with long names with "_" char - like "template_scp"</span>
<span class="co0">#so we cheats it by standard "user" name</span>
<span class="re2">dummyuser</span>=<span class="st0">"user"</span>
<span class="re2">dummyhome</span>=<span class="st0">"/store"</span>
<span class="re2">dummyshell</span>=<span class="st0">"/usr/bin/oafish"</span>
<span class="kw2">cat</span> <span class="sy0">/</span>etc<span class="sy0">/</span><span class="kw2">passwd</span> <span class="sy0">|</span> <span class="kw2">awk</span> <span class="re5">-F</span><span class="st0">":"</span> <span class="st_h">'{if($3=='</span><span class="re1">$targetuid</span><span class="st_h">'){print "'</span><span class="re1">$dummyuser</span><span class="st_h">':"$2":"$3":"$4":"$5":'</span><span class="re1">$dummyhome</span><span class="st_h">':'</span><span class="re1">$dummyshell</span><span class="st_h">'"}}'</span> <span class="sy0">>></span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span><span class="kw2">passwd</span>
 
<span class="kw2">cat</span> <span class="sy0">/</span>etc<span class="sy0">/</span>group <span class="sy0">|</span> <span class="kw2">awk</span> <span class="re5">-F</span><span class="st0">":"</span> <span class="st_h">'{if($3==0){print $0}}'</span> <span class="sy0">></span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>group
<span class="re2">dummygroup</span>=<span class="st0">"users"</span>
<span class="kw2">cat</span> <span class="sy0">/</span>etc<span class="sy0">/</span>group <span class="sy0">|</span> <span class="kw2">awk</span> <span class="re5">-F</span><span class="st0">":"</span> <span class="st_h">'{if($3=='</span><span class="re1">$targetgid</span><span class="st_h">'){print "'</span><span class="re1">$dummygroup</span><span class="st_h">':"$2":"$3":"$4}}'</span> <span class="sy0">>></span> <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>group
 
ldconfig
<span class="kw2">cp</span> <span class="sy0">/</span>etc<span class="sy0">/</span>ld.so.cache <span class="re1">$targetdir</span><span class="sy0">/</span>etc<span class="sy0">/</span>ld.so.cache
 
<span class="kw2">mkdir</span> <span class="re5">-p</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib<span class="sy0">/</span>tls<span class="sy0">/</span>
<span class="kw2">cp</span> <span class="sy0">/</span>lib<span class="sy0">/</span>libc.so.6 <span class="re1">$targetdir</span><span class="sy0">/</span>lib<span class="sy0">/</span>libc.so.6
 
<span class="kw2">rm</span> <span class="re5">-rf</span> <span class="re1">$targetdir</span><span class="sy0">/</span>store
<span class="kw2">mkdir</span> <span class="re1">$targetdir</span><span class="sy0">/</span>store
<span class="kw2">chown</span> <span class="re5">-R</span> <span class="re1">$targetuser</span>.users <span class="re1">$targetdir</span><span class="sy0">/</span>store
 
<span class="kw3">echo</span> <span class="re4">$2</span> <span class="sy0">|</span> <span class="kw2">passwd</span> <span class="re5">--stdin</span> <span class="re1">$targetuser</span>
 
<span class="kw1">if</span> <span class="br0">[</span> <span class="re1">$ARCH</span> = <span class="st0">"x86_64"</span> <span class="br0">]</span>; <span class="kw1">then</span>
  <span class="kw3">echo</span> <span class="st0">"64bit OS, I will copy all libs (workaround) see http://www.magenbrot.net/wiki/linux/chroot-jail_fuer_scp_sftp_erstellen)"</span>
  <span class="kw2">rm</span> <span class="re5">-rf</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib64<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/*</span>
  <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib<span class="sy0">/</span>
  <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>lib64<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>lib64<span class="sy0">/</span>
  <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>
  <span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/*</span> <span class="re1">$targetdir</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>
<span class="kw1">fi</span>                                                                                  
```

</dd></dl></div></div>Falls jemand die vergebenen Passwörter nicht in der history finden will, einfach die letzte Zeile des Scripts durch folgende ersetzen: „passwd $targetuser“, dann wird das Kennwort beim Anlegen abgefragt. In Zeile 58 müsste dann natürlich noch die Abfrage auf $1 geändert werden.

5\. Jetzt werden noch folgende Dateien in /usr/local/setup\_chroot angelegt:

<div id="bkmrk-%23include-%3Cstdio.h%3E-%C2%A0"><div>```
#include <stdio.h>
 
main()
{
        printf("root users\n");
        return 0;
}
```

```
/lib
/usr/lib
```

</div></div>6\. Die Datei groups.c muss noch kompiliert werden, der Gnu C-Compiler muss ggf. mit „yum -y install gcc“ nachinstalliert werden. Mittels „gcc groups.c -o groups“ wird das Binary gebaut. Diese Datei wird unter RedHat/CentOS und Konsorten gebraucht, um die vorhandenen Gruppen zu ermitteln. Da wir den Usern aber keinen Überblick über die wirklich vorhandenen Gruppen geben wollen, wird dieses Binary ins Chroot kopiert, das nur die Gruppen root und users ausgibt.

7\. Jetzt kann mit folgendem Aufruf ein SCP-User erzeugt werden:

<div id="bkmrk-%2Fusr%2Flocal%2Fsetup_chr-0"><div>```
/usr/local/setup_chroot/create_chroot_user.sh <username> <passwort>
```

</div></div>8\. Mittels WinSCP läßt sich das Ganze dann testen. Das Userhome ist /home/&lt;username&gt;/store. Die User dürfen nicht aus /home/&lt;username&gt; heraus und haben außer auf /home/&lt;username&gt;/store keine Schreibrechte.

#### Debug-Modus bei Problemen

Mit folgendem Befehl läßt sich ein erweitertes Logging aktivieren. scponly logt nach /var/log/secure

<div id="bkmrk-echo-2-%3E-%2Fetc%2Fscponl"><div>```
echo 2 > /etc/scponly/debuglevel
```

</div></div>und wieder deaktivieren:

<div id="bkmrk-echo-0-%3E-%2Fetc%2Fscponl">```
echo 0 > /etc/scponly/debuglevel
```

</div>#### Anmerkungen:

Bei 32bit Servern hat die oben gezeigte Anleitung immer problemlos funktioniert. Allerdings hatte ich bei 64bit Servern Probleme. Das Script bedarf hier noch einiger Arbeit. In /var/log/secure tauchten beim Verbindungsversuch folgende Meldungen auf:

<div id="bkmrk-may-6-13%3A36%3A21-files"><div>```
May  6 13:36:21 files scponly[4846]: chrooted binary in place, will chroot()
May  6 13:36:21 files scponly[4846]: 3 arguments in total.
May  6 13:36:21 files scponly[4846]:    arg 0 is scponlyc
May  6 13:36:21 files scponly[4846]:    arg 1 is -c
May  6 13:36:21 files scponly[4846]:    arg 2 is /usr/libexec/openssh/sftp-server
May  6 13:36:21 files scponly[4846]: opened log at LOG_AUTHPRIV, opts 0x00000029
May  6 13:36:21 files scponly[4846]: determined USER is "testuser" from environment
May  6 13:36:21 files scponly[4846]: retrieved home directory of "/home/testuser//store" for user "testuser"
May  6 13:36:21 files scponly[4846]: Setting homedir to /store
May  6 13:36:21 files scponly[4846]: chrooting to dir: "/home/testuser"
May  6 13:36:21 files scponly[4846]: chdiring to dir: "/store"
May  6 11:36:21 files scponly[4846]: setting uid to 500
May  6 11:36:21 files scponly[4846]: processing request: "/usr/libexec/openssh/sftp-server"
May  6 11:36:21 files scponly[4846]: Using getopt processing for cmd /usr/libexec/openssh/sftp-server  (username: testuser(500), IP/port: 123.123.123.123 1946 22)
May  6 11:36:21 files scponly[4846]: running: /usr/libexec/openssh/sftp-server (username: testuser(500), IP/port: 123.123.123.123 1946 22)
May  6 11:36:21 files scponly[4846]: about to exec "/usr/libexec/openssh/sftp-server" (username: testuser(500), IP/port: 123.123.123.123 1946 22)
May  6 11:36:21 files scponly[4846]: failed: /usr/libexec/openssh/sftp-server with error No such file or directory(2) (username: testuser(500), IP/port: 123.123.123.123 1946 22)
```

</div></div>Das Binary und die via ldd angezeigten Libraries wurden aber installiert (bzw. durch das Script kopiert). Ich konnte das Problem dadurch lösen, das ich alle Libs in /lib, /lib64 und /usr/lib, /usr/lib64 in das Chroot kopiert habe. Ich habe das create\_chroot\_user.sh entsprechend angepasst (irgendwann muss ich das mal noch bereinigen), damit bei einem 64bit System alle Libs kopiert werden.

<div id="bkmrk-rm--rf-%2Fhome%2Ftestuse">```
<span class="kw2">rm</span> <span class="re5">-rf</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>lib64<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/*</span>
<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>lib<span class="sy0">/</span>
<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>lib64<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>lib64<span class="sy0">/</span>
<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>
<span class="sy0">/</span>bin<span class="sy0">/</span><span class="kw2">cp</span> <span class="re5">-L</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/*</span> <span class="sy0">/</span>home<span class="sy0">/</span>testuser<span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>
```

</div>