miércoles, marzo 26, 2008

MacOS X: Como añadir un servidor ssh en un puerto distinto al 22

Por defecto, en MacOS X el servidor de ssh se ejecuta a través del sistema launchd. Este proceso es el encargado de abrir el socket, esperar las conexiones y cuando esta se reciba, ejecuta el proceso servidor sshd. La configuración de launchd para el sistema sshd se encuentra en el fichero /System/Library/LaunchDaemons/ssh.plist. Si queremos tener otra instancia que escuche en otro puerto distinto, lo que se hace es copiar el fichero. Por ejemplo, si se quiere tener otro ssh escuchando en el puerto 443, se copia el fichero y se renombra. En este ejemplo voy a llamarlo ssh443.plist.

Cada servicio bajo la supervisión de launchd, está indentificado por una etiqueta única. Si por ejemplo editamos el fichero ssh.plist, el servicio ssh está identificado por:

...
<key>Label</key>
<string>com.openssh.sshd</string>
...
La etiqueta que identifica al servicio es com.openssh.sshd y debe de ser única en en todos los servicios bajo supervisión de launchd. Por tanto, se edita el fichero ssh443.plist para que la etiqueta sea única. En el ejemplo he usado com.openssh.sshd443:
...
<key>Label</key>
<string>com.openssh.sshd443</string>
...
Ahora hay se editará el fichero del nuevo servicio para que escuche en el puerto 443 por tcp. Si miramos el fichero original ssh.plist
...
<dict>
  <key>Listeners</key>
    <dict>
      <key>Bonjour</key>
        <array>
          <string>ssh</string>
          <string>sftp-ssh</string>
        </array>
      <key>SockServiceName</key>
        <string>ssh</string>
  </dict>
</dict>
...
Este trozo del fichero de configuración, hará que launchd escuché en el puerto que obtenga de resolver el service name ssh a través del fichero /etc/services - que por defecto será el 22 - y que por otra parte utiliza el sistema Bonjour para publicar por multicast DNS que la máquina corre los servicios ssh en el puerto anterior.

En el caso del ejemplo, lo que se quiere es solamente que escuche en el puerto 443 a través de tcp. Para ello, se modificará el fichero ssh443.plist de tal manera que los listener sólo escuche en dicho puerto:

...
<dict>
  <key>Listeners</key>
    <dict>
      <key>SockServiceName</key>
      <string>443</string>
      <key>SockType</key>
      <string>stream</string>
    </dict>
</dict>
...
El resto del fichero se queda igual que el ssh.plist.

Para terminara con la gestión de launchd, debe de cargarse la nueva configuración en el sistema. Para ello usaremos el comando de control del daemon launchctl>. Este comando debe de ejecutarse por un usuario que sea administrador de la máquina. Para ello:

cd /System/Library/LaunchDaemons
sudo launchctl
launchd% load ssh443.plist launchd% ^D
(Se sale de lauchctl pulsando ctrl + D.) No olvidar, en caso de que se esté usando el firewall de MacOS X de habilitar una regla para el tráfico tcp al puerto 443, ya que sino, no funcionará.

Fichero ssh443.plist

<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.openssh.sshd443</string>
  <key>Program</key>
  <string>/usr/libexec/sshd-keygen-wrapper</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/sbin/sshd</string>
    <string>-i</string>
  </array>
  <key>SessionCreate</key>
  <true/>
  <key>Sockets</key>
  <dict>
    <key>Listeners</key>
    <dict>
      <key>SockServiceName</key>
      <string>443</string>
      <key>SockType</key>
      <string>stream</string>
    </dict>
  </dict>
  <key>StandardErrorPath</key>
  <string>/dev/null</string>
  <key>inetdCompatibility</key>
    <dict>
    <key>Wait</key>
    <false/>
  </dict>
</dict>
</plist>

Referencias

Technorati Tags:

No hay comentarios: