Jump to content

[Résolu]initrd et dropbear


Recommended Posts

Bonjour à tous,

Je tente de faire une connexion ssh à un de mes serveurs dans l'initrd, j'ai fais une image custom afin de monter dropbear et de le lancer dans l'initrd.

Dropbear se lance bien, mais il ne reconnais pas les utilisateurs ... j'ai regarder le contenu du passwd/group et du shadow, ils sont bons.

Dans le debug, il me met que je tente de m'authentifier avec un user non existant sur le domaine.

PS: le but de tout ceci est de décrypter un système de fichier à distance via une connexion ssh.

je vous donne le script utilisé :

#!/bin/bash

# We add dropbear to the initrd to be able
# mount crypted partitions from remote

# copyright Wulf Coulmann
# GNU GPL
# http://www.gnu.org/licenses/gpl.html
#
# Download me here: http://gpl.coulmann.de/dropbear
# get infos about this script here:
# http://gpl.coulmann.de/ssh_luks_unlock.html
#
# Modified by Anonymous 2008

### INSTRUCTIONS FOR DEBIAN ETCH ###
# 1. Install killall, busybox and dropbear:
#	~# apt-get install psmisc busybox dropbear
# 2. Edit network configuration below and copy contents 
#	of this file to /etc/initramfs-tools/hooks/dropbear
# 3. Make it executable:
#	~# chmod +x /etc/initramfs-tools/hooks/dropbear
# 4. Create new initrd:
#	~# mkinitramfs -o /boot/my_name_of_the_initrd
# 5. Edit /boot/grub/menu.lst and add your new initrd as the first entry
# 6. ???
# 7. Profit!


PREREQ=""
prereqs()
{
 echo "$PREREQ"
}

case $1 in
prereqs)
 prereqs
 exit 0
;;
esac

# Begin real processing below this line

# load the prepared functions of debians initramfs enviroment
source /usr/share/initramfs-tools/hook-functions

# build the directories
DIRS='/usr/bin /usr/sbin/ /proc/ /root/.ssh/ /var/ /var/run/ /etc/dropbear/' 

for now in $DIRS; do
if [ ! -e ${DESTDIR}$now ] 
then
   mkdir -p ${DESTDIR}$now
fi
done

# copy the ssh-daemon and librarys
copy_exec /usr/sbin/dropbear /usr/sbin/
copy_exec /usr/bin/passwd /usr/bin/
copy_exec /bin/login /bin/
copy_exec /usr/bin/killall /usr/bin/
copy_exec /sbin/route /sbin/
copy_exec /usr/bin/awk /usr/bin/

# some librarys are not autoincluded by copy_exec
copy_exec /lib/libnss_compat.so.2 /lib/
copy_exec /usr/lib/libz.so.1 /usr/lib/
copy_exec /etc/ld.so.cache /etc/
copy_exec /lib/libutil.so.1 /lib/

# we copy config and key files
cp -pr /etc/dropbear/dropbear_dss_host_key ${DESTDIR}/etc/dropbear/
cp -pr /etc/dropbear/dropbear_rsa_host_key ${DESTDIR}/etc/dropbear/
cp -pr /etc/passwd ${DESTDIR}/etc/  
cp -pr /etc/shadow ${DESTDIR}/etc/
cp -pr /etc/group ${DESTDIR}/etc/
if [ -e /root/.ssh/authorized_keys ]
then
 cp -pr /root/.ssh/authorized_keys ${DESTDIR}/root/.ssh/
fi
cp -pr /etc/nsswitch.conf  ${DESTDIR}/etc/
cp -pr /etc/localtime  ${DESTDIR}/etc/

# we don't have bash in our initrd 
# also we only add the root account
cat  /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > ${DESTDIR}/etc/passwd   
cat  /etc/shadow | grep root > ${DESTDIR}/etc/shadow   
cat  /etc/group | grep root > ${DESTDIR}/etc/group  

cat >${DESTDIR}/scripts/local-top/network_ssh << 'EOF'
#!/bin/sh

# we start the network and ssh-server

PREREQ=""
prereqs()
{
 echo "$PREREQ"
}

case $1 in
prereqs)

 prereqs
 exit 0
;;
esac

# Begin real processing below this line

# build up helpful environment
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir --mode=0700 /root
[ -d /tmp ] || mkdir /tmp
[ -d /sys ] || {
 mkdir /sys
 mount -t sysfs -o nodev,noexec,nosuid none /sys
}
[ -d /proc ] || {
 mkdir /proc
 mount -t proc -o nodev,noexec,nosuid none /proc

}

mkdir -p /var/lock
mkdir -p /var/log
touch /var/log/lastlog
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts


################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs 
ifconfig eth0 192.168.0.5 netmask 255.255.255.0
route add default gw 192.168.0.1
################# CHANGE THE LINES ABOVE #################


# If you like to use dhcp make sure you include dhclient or pump in 
# /etc/initramfs-tools/hooks/dropbear via
#	 copy_exec /sbin/dhclient


# for debugging ssh-server you may run it in forgound  
#	  /usr/sbin/dropbear -E -F
# for more debugging you may run it with strace
# therfor you have to include strace and nc at top of 
# /etc/initramfs-tools/hooks/dropbear via
#	 copy_exec /usr/bin/strace
#	 copy_exec /usr/bin/nc
# then start nc on an other host and run
#	 /usr/sbin/dropbear -E -F  2>&1 | /bin/nc -vv <ip of other host> <nc port of other host>   
#	 e.g.: 
#	 /usr/sbin/dropbear -E -F  2>&1 | /bin/nc -vv 192.168.1.2 8888   

# We will use /dev/urandom because /dev/random gets easily blocked
mv /dev/random /dev/random.old
ln -s /dev/urandom /dev/random
/usr/sbin/dropbear -E -F -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
rm -f /dev/random
mv /dev/random.old /dev/random
EOF
chmod 700 ${DESTDIR}/scripts/local-top/network_ssh

cat >${DESTDIR}/etc/dropbear/banner << 'EOF'

 To unlock root-partition run
	unlock


EOF

# script to unlock luks via ssh 
# dirty but effektive 
cat >${DESTDIR}/usr/bin/unlock << 'EOF'
#!/bin/sh

/bin/sh /scripts/local-top/cryptroot

# Kill processes locking boot process 
[ `ls /dev/mapper/ | grep -v control| wc -l | awk '{print $1}'` -gt 0 ] && {
 for i in `ps | grep -E "cryptroot|cryptsetup" | awk '{ print $1 }'`
 do
kill $i
 done
}
EOF

chmod 700 ${DESTDIR}/usr/bin/unlock

# make sure we exit dropbear at the end of the startup process
cat >${DESTDIR}/scripts/local-bottom/rm_dropbear << 'EOF'
#!/bin/sh
PREREQ=""

prereqs()
{
 echo ""
}

case $1 in
prereqs)

 prereqs
 exit 0
;;
esac

# Begin real processing below this line
# we kill dropbear ssh-server 

/usr/bin/killall dropbear

EOF
chmod 700 ${DESTDIR}/scripts/local-bottom/rm_dropbear

Link to comment
Share on other sites

Plus de détails ici, par exemple :chinois:

Euh, sinon, le passwd et le shadow dont tu parles, ce sont ceux que tu as copiés dans l'initrd ?

Bon, l'article est une très bonne preuve de faisabilité du concept, mais je t'encourage vivement à bien lire le script de création de l'initrd (et surtout, à le comprendre)... la version que tu nous linkes m'a l'air un peu différente de celle de Debian Administration, mais est du même auteur... et déjà, c'est goretto (et c'est avoué), cf la remarque en marge du script sur le lien que j'ai donné :

cp -pr /etc/dropbear ${DESTDIR}/etc/
cp -pr /etc/passwd ${DESTDIR}/etc/		  # quick and dirty, to keep file attributs  
cp -pr /etc/shadow ${DESTDIR}/etc/

:transpi: ... le "cp -pr", juste pour avoir les bonnes permissions sur les fichiers... mouais... j'ai bien parlé de "proof of concept"...

... suivi d'un "cat /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > ${DESTDIR}/etc/passwd", parce que si on voulait authoriser un autre utilisateur que root à se logguer, l'initrd serait un poil lourdeau... bon, c'est écris un poil différemment dans le script que tu as récupéré, mais l'idée est la même...

... en fait, tu n'essaierais pas de te connecter avec un autre utilisateur que root, là ? D'autant que le script est censé te virer l'inutile de passwd er de shadow : donc, si tu y trouves d'autres utilisateurs, tu es sûr de regarder le bon ?

Link to comment
Share on other sites

Le script que j'ai utilisé vient du site dont tu parle :)

Le script fourni dans le tuto ne marche pas, j'aitulisé celui dispo dans les commentaires du topic.

je m'authentifie par clef privé/publique, j'ai testé en créant le fichier passwd à la mano en copiant celui du serveur (qui marche).

Je penses plutôt à un souci ailleurs ...

et voui, les fichiers dont je parle sont bien ceux de l'initrd, que j'ai même recréé pour l'occasion.

Link to comment
Share on other sites

Bah, tu parles des utilisateurs... or, si le script se passe bien, le seul utilisateur dans le passwd et le shadow devrait être root (en fait, une copie du root du serveur une fois déchiffré... ce que je trouve assez crade... j'aurais plutôt tendance à définir une bonne fois pour toute un root pour le système, avec un mot de passe scramblé qui ne permet rien, et à gérer des clés RSA spéciales pour lui... car de toute façon, je n'ai pas de clés pour les roots de mes systèmes, vu que je ne m'en sers jamais directement)...

Le principe, ici, c'est de faire au minimal : un dropbear (ie serveur SSH léger), un seul utilisateur à gérer (root), un shell tout con (pas de bash, ici, c'est sh)... donc, c'est en tant que root, que tu dois te connecter, et c'est le seul utilisateur dont il doit être question dans l'initrd...

C'est bien avec le couple de clés de root que tu essaies de te connecter ?

Après, si tu doutes de ta config de dropbear, bah, tu désactives openssh sur ton système s'il est activé, et tu actives dropbear (rcconf te facilitera la vie, si tu es sous Debian)... tu pourras alors affiner sa config en testant en live sur un système complet...

Link to comment
Share on other sites

déjà testé dropbear comme serveur ssh une fois debian booté, ça marche niquel. Un bon coup d'update-rc.d m'a permis sans trop de difficulté de me séparer d'openssh

Sésolé de l'abus de langage pour le 'des', je n'utilise évidemment que root qui a ses propres clés privées/publiques, différentes de celles du root du système.

Pitète une librairie qui manque ... Mais dropbear se lance correctement, pas de message dans le debug.

Link to comment
Share on other sites

Je tiens au courant de mes recherches sur strace

Au plaisir :transpi:

Je n'ai pas encore testé ce script en pratique (enfin, pas entièrement), mais l'article m'avait bien intéressé, et je pense que c'est une solution qui pourrait être intéressante à mettre en place...

... modulo que pour bien faire, il faudrait aussi le faire sur la gateway (enfin, sur toutes les machines pour lesquelles je dois bien laisser la porte ouverte en été, faute de pouvoir et même de vouloir me payer une clim :chinois: ), et encore inclure ce qu'il faut pour se connecter dans l'initrd, soit dans mon cas pppd...

... et qu'il faudrait quelque chose pour vérifier si l'initrd n'a pas été modifié... mais là, ça devient plus compliqué... parce que si on le fait après avoir déchiffré le système, il est trop tard pour le système, et si on le fait avant, faut intégrer de quoi vérifier le hash dans l'initrd... ce qui est futile, si on met en doute son intégrité... même en dumpant l'initrd et en le vérifiant sur le client, une fois connecté en root, qui nous dit que l'initrd n'a pas été modifié pour nous renvoyer la signature qui était la sienne avant qu'il se fasse détourner, pour mieux nous tromper... ?

A la limite, faudrait pouvoir signer l'initrd et faire du drm en restreignant les initrd qui peuvent tourner sur le matos :transpi: Bon, le risque, c'est de toute façon l'usine à gaz, juste pour protéger la clé de chiffrement de LUKS, alors que les choses sont ainsi faites qu'il y a de toute façon des moyens de la récupérer, à un moment ou un autre (le problème étant que c'est quand elle est utilisée qu'il y a un risque... ce qui est pourtant l'intérêt du système)...

Link to comment
Share on other sites

Barbarou :)

Je voulai crypter avec l'@Mac de la machine, modulo un paramètre ou deux ... Ca suffira pour un début, et ces infos sont récupérables via ifconfig qui est déjà incorporé dans le initrd. Après, pour le hash, un test avec md5sum, ça suffira :]

j'ai trouvé le souci .... pitète .... des librairies manquantes, merci strace et nc, super sympa ces soft au passage !

sur le serveur
nc -l -p $PortListening

sur le client :
strace TheCommandQuiTue 2>&1 | nc -vv $IpAy $PortEnvoi

Link to comment
Share on other sites

Après, pour le hash, un test avec md5sum, ça suffira :]

Bah, en y réfléchissant, c'est l'utilité même du hash de /boot, que je remets en question...

Si tu le fais avant le déchiffrage, il faut faire confiance à ce qu'embarque l'initrd pour discuter avec toi... et si tu le soupçonnes d'être corrompu, ça ne sert strictement à rien :transpi:

Si tu le fais après, bah, la clé de chiffrement (enfin, la passhrase LUKS) a pu être interceptée... Pour un peu, vu qu'on parle d'une machine distante, le margoulin derrière tout ça aura eu le temps de dumper en local les parties croustillantes, pour voir si tu ne ferais pas gaffe à ce que le hash ait changé (si rien ne l'a déjà empêché de le faire une fois le système booté, si tu as été laxiste sur les permissions)... bon, là, tu le détectes, tu remets la machine comme il faut, mais la prochaine fois, au moment où la clé LUKS (enfin, fonction de ce que le système a subi, après inspection, il aura peut-être juste fallu changer la passphrase, sans reformater) sera insérée, avant de lancer le système, l'initrd corrompu se sera assuré que le système te dise "oui-oui, le hash est cool", quoi qu'il en soit dans les faits...

Non, dans un cas comme dans l'autre, vu que tu n'as pas accès à la machine, le hash, tu ne peux avoir qu'une confiance limitée en lui ; bon, forcément, je paranoïse, j'extrapole, je vais au pire, mais le principe est que c'est quand même dommage de laisser l'initrd sur une machine chiffrée... probablement chiffrée, car elle est exposée en public...

Pour une machine à laquelle j'ai physiquement accès (typiquement, un laptop), bah, c'est facile : je colle le /boot sur un disque externe, et zou... pas besoin de hash non plus, si la clé ne me quitte pas (accessoirement, je fantasme sur un combo stockage USB/lecteur smartcard [:transpi:], pour avoir au chaud les clés RSA qui me permettraient de mettre à jour les machines [vive PAM], de déchiffrer les messages destinés aux admins, et de signer des paquets à coller dans le dépôt local, ainsi que de l'espace de stockage... comme ça, quand je dois administrer, hop, j'ai le /boot, mes scripts et cie sur moi... apparemment, on peut même stocker des clés et passphrases en tant qu'objets privés dans les smartcards :francais: , bien qu'on doive les générer en dehors, vu que c'est pour du chiffrement symétrique, et que linux ne gère de toute façon pas l'AES dans ces bousins... bon, je prends note : ne pas faire cette opération sous Debian [auto- :roll: - :roll: ] ... sinon, on peut chiffrer les AES/passphrases avec une clé publique, dont la clé privée reste dans la smartcard, sans jamais être exposée, et stocker les clés chiffrées sur l'USB, voire dans l'initrd...)...

Mais pour une machine distante, ça me paraît plus compliqué... à la limite, peut-être avec un truc à base de boot PXE (je ne connais pas bien, mais j'imagine que ça doit être possible) : grosso merdo, lors de chaque boot, tu recrées un nouveau kernel, à injecter au prochain boot, dans lequel tu mets un nouveau secret (totalement aléatoire... si c'est prédictible, forcément, ça ne sert à rien...), de telle sorte que si un petit malin reboote et t'attends avec un liveCD pour logger la passphrase LUKS (pas très dur de voir ce que c'est et d'imaginer la technique que tu as utilisée, en utilisant justement un liveCD, dans lequel HAL va miraculeusement nous apprendre que tu utilises LUKS), bah non - il n'a pas le nouveau secret, et tu le checkes avant de balancer la purée dans LUKS (et là, alarmes, fermeture des grilles, les chiens, les vigiles, les forces spéciales, les missiles ballistiques : la totale ! )...

Du kernel signé à la mimine, avec un poil de roulage à la main sous les aisselles, quoi (mais ceci dit vachement plus pertinent à mes yeux qu'un hash, qui me paraît inutile dans tous les cas, donnant au pire une fausse impression de sécurité)...

Sinon, quitte à s'en foutre du /boot en clair, bah, autant faire sans hash... c'est juste lui, dans cette problématique, que je remets en cause... à la limite, le hash, sur la partition à chiffrer, une fois le système booté et sauvegardé via rsync ou assimilé : oui, là, d'accord, pour voir si des emmerdeurs ne s'amusent pas avec des failles sur le système booté (et encore : ça ne dispense pas de vérifier localement de temps en temps) :transpi: ...

Link to comment
Share on other sites

Je doute que ce soit un problème de librairie en fait ...

Je joint le strace, mais les alertes concernant les librairies manquantes sont normales à priori (google speak)

execve("/usr/sbin/dropbear", ["/usr/sbin/dropbear", "-E", "-F", "-b", "/etc/dropbear/banner", "-d", "/etc/dropbear/dropbear_dss_host_"..., "-r", "/etc/dropbear/dropbear_rsa_host_"..., "-p", "22"], [/* 17 vars */]) = 0
uname({sys="Linux", node="(none)", ...}) = 0
brk(0)								  = 0x8068000
access("/etc/ld.so.nohwcap", F_OK)	  = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f56000
access("/etc/ld.so.preload", R_OK)	  = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)	  = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=10495, ...}) = 0
mmap2(NULL, 10495, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f53000
close(3)								= 0
access("/etc/ld.so.nohwcap", F_OK)	  = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/sse2/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686/sse2/cmov", 0xbf82f508) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/sse2/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686/sse2", 0xbf82f508) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686/cmov", 0xbf82f508) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/i686", 0xbf82f508)	 = -1 ENOENT (No such file or directory)
open("/lib/tls/sse2/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/sse2/cmov", 0xbf82f508) = -1 ENOENT (No such file or directory)
open("/lib/tls/sse2/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/sse2", 0xbf82f508)	 = -1 ENOENT (No such file or directory)
open("/lib/tls/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls/cmov", 0xbf82f508)	 = -1 ENOENT (No such file or directory)
open("/lib/tls/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/tls", 0xbf82f508)		  = -1 ENOENT (No such file or directory)
open("/lib/i686/sse2/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686/sse2/cmov", 0xbf82f508) = -1 ENOENT (No such file or directory)
open("/lib/i686/sse2/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686/sse2", 0xbf82f508)	= -1 ENOENT (No such file or directory)
open("/lib/i686/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686/cmov", 0xbf82f508)	= -1 ENOENT (No such file or directory)
open("/lib/i686/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686", 0xbf82f508)		 = -1 ENOENT (No such file or directory)
open("/lib/sse2/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/sse2/cmov", 0xbf82f508)	= -1 ENOENT (No such file or directory)
open("/lib/sse2/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/sse2", 0xbf82f508)		 = -1 ENOENT (No such file or directory)
open("/lib/cmov/libutil.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/cmov", 0xbf82f508)		 = -1 ENOENT (No such file or directory)
open("/lib/libutil.so.1", O_RDONLY)	 = 3
read(3, "\177ELF\1\1\1\\\\\3\3\1\\260\f\"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=9656, ...}) = 0
mmap2(NULL, 12432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f4f000
mmap2(0xb7f51000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0xb7f51000
close(3)								= 0
access("/etc/ld.so.nohwcap", F_OK)	  = -1 ENOENT (No such file or directory)
open("/usr/lib/libz.so.1", O_RDONLY)	= 3
read(3, "\177ELF\1\1\1\\\\\3\3\1\\340\26"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=78500, ...}) = 0
mmap2(NULL, 81456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f3b000
mmap2(0xb7f4e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12) = 0xb7f4e000
close(3)								= 0
access("/etc/ld.so.nohwcap", F_OK)	  = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libcrypt.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libcrypt.so.1", O_RDONLY)	= 3
read(3, "\177ELF\1\1\1\\\\\3\3\1\�00\10\"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=21868, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f3a000
mmap2(NULL, 184636, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7f0c000
mmap2(0xb7f11000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4) = 0xb7f11000
mmap2(0xb7f13000, 155964, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f13000
close(3)								= 0
access("/etc/ld.so.nohwcap", F_OK)	  = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)		= 3
read(3, "\177ELF\1\1\1\\\\\3\3\1\\220T\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1147548, ...}) = 0
mmap2(NULL, 1157428, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7df1000
mmap2(0xb7f02000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x110) = 0xb7f02000
mmap2(0xb7f09000, 10548, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f09000
close(3)								= 0
mprotect(0xb7f02000, 20480, PROT_READ)  = 0
munmap(0xb7f53000, 10495)			   = 0
stat64("/etc/dropbear/banner", {st_mode=S_IFREG|0644, st_size=57, ...}) = 0
brk(0)								  = 0x8068000
brk(0x8089000)						  = 0x8089000
open("/etc/dropbear/banner", O_RDONLY)  = 3
read(3, "\n	 To unlock root-partition r"..., 57) = 57
close(3)								= 0
rt_sigaction(SIGINT, {0x8056330, [INT], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTERM, {0x8056330, [TERM], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGCHLD, {0x8056490, [RT_3 RT_5 RT_6 RT_7 RT_9 RT_11 RT_12 RT_13 RT_14 RT_15 RT_16 RT_18 RT_24 RT_25 RT_26 RT_27 RT_28 RT_29 RT_30], SA_NOCLDSTOP}, NULL, 8) = 0
rt_sigaction(SIGSEGV, {0x8056450, [SEGV], SA_RESTART}, {SIG_DFL}, 8) = 0
open("/etc/dropbear/dropbear_rsa_host_key", O_RDONLY) = 3
read(3, "\\7ssh-rsa\\1#\\1\1\310f\325\344\214\336"..., 1700) = 804
read(3, "", 896)						= 0
close(3)								= 0
open("/etc/dropbear/dropbear_dss_host_key", O_RDONLY) = 3
read(3, "\\7ssh-dss\\201\324\223\271\336N\312\3723\324"..., 1700) = 457
read(3, "", 1243)					   = 0
close(3)								= 0
open("/dev/random", O_RDONLY)		   = 3
select(4, [3], NULL, NULL, {2, 0})	  = 1 (in [3], left {2, 0})
read(3, "\256dj\365\'\322\332\335\363\213\376\312w3\336\373,\10"..., 32) = 32
close(3)								= 0
time(NULL)							  = 1211573559
open("/etc/localtime", O_RDONLY)		= 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=2945, ...}) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=2945, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f55000
read(3, "TZif2\\\\\\\\\\f\\f\"..., 4096) = 2945
close(3)								= 0
munmap(0xb7f55000, 4096)				= 0
stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2945, ...}) = 0
getpid()								= 907
write(2, "[907] May 23 22:12:39 Not forkin"..., 34[907] May 23 22:12:39 Not forking
) = 34
open("/var/run/dropbear.pid", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
getpid()								= 907
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f55000
write(3, "907\n", 4)					= 4
close(3)								= 0
munmap(0xb7f55000, 4096)				= 0
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = -1 EAFNOSUPPORT (Address family not supported by protocol)
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EINVAL (Invalid argument)
close(3)								= 0
socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = -1 EAFNOSUPPORT (Address family not supported by protocol)
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=5}, 8) = 0
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
setsockopt(3, SOL_IP, IP_TOS, [16], 4)  = 0
setsockopt(3, SOL_SOCKET, SO_PRIORITY, [6], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(22), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 20)						   = 0
select(4, [3], NULL, NULL, {60, 0})	 = 1 (in [3], left {56, 736000})
accept(3, {sa_family=AF_INET, sin_port=htons(3136), sin_addr=inet_addr("192.168.17.1")}, [16]) = 4
pipe([5, 6])							= 0
fork([913] May 23 22:12:43 Child connection from 192.168.17.1:3136
)								  = 913
close(6)								= 0
close(4)								= 0
select(6, [3 5], NULL, NULL, {60, 0}[913] May 23 22:12:46 login attempt for nonexistent user from 192.168.17.1:3136

Je vais vérifier avec dropbear en fonctionnement normal pour comparer.

Pour ce qui concerne la sécurité ... je ne monte pas non plus un système pour une centrale nucléaire ^^

Je ne penses pas que les personnes à qui je donne les serveurs soient capables de me monter un initrd qui fasse la même chose tout en envoyant les résultats de ce que je tape .... S'ils savaient faire ça, ils n'auraient pas besoin du service que j'apporte.

Mais je testerai quand même par curiosité ^^

[EDIT]

j'ai trouvé pour aller un poil plus loin :)

il manquait bien des librairies ...

il faut donc rajouter les librairies TLS dans le initrd :

cp -rp /lib/tls /lib/

J'ai encore un souci pour booter le système une fois les disques dérouillés

Je vous tiens au jus !

[/EDIT]

Link to comment
Share on other sites

#!/bin/bash

# We add dropbear to the initrd to be able
# mount crypted partitions from remote

# copyright Wulf Coulmann
# GNU GPL
# http://www.gnu.org/licenses/gpl.html
#
# Download me here: http://gpl.coulmann.de/dropbear
# get infos about this script here:
# http://gpl.coulmann.de/ssh_luks_unlock.html
#
# Modified by Anonymous 2008
# Modified By Geoffroy RABOUIN 26/05/2008

### INSTRUCTIONS FOR DEBIAN ETCH ###
# 1. Install killall, busybox and dropbear:
#	~# apt-get install psmisc busybox dropbear
# 2. Edit network configuration below and copy contents 
#	of this file to /etc/initramfs-tools/hooks/dropbear
# 3. Make it executable:
#	~# chmod +x /etc/initramfs-tools/hooks/dropbear
# 4. Create new initrd:
#	~# mkinitramfs -o /boot/my_name_of_the_initrd
# 5. Edit /boot/grub/menu.lst and add your new initrd as the first entry
# 6. ???
# 7. Profit!


PREREQ=""
prereqs()
{
 echo "$PREREQ"
}

case $1 in
prereqs)
 prereqs
 exit 0
;;
esac

# Begin real processing below this line

# load the prepared functions of debians initramfs enviroment
source /usr/share/initramfs-tools/hook-functions

# build the directories
DIRS='/lib /bin /usr/bin /usr/sbin/ /proc/ /root/.ssh/ /var/ /var/run/ /etc/dropbear/' 
for now in $DIRS; do
if [ ! -e ${DESTDIR}$now ] 
then
   mkdir -p ${DESTDIR}$now
fi
done

# copy the ssh-daemon and librarys
copy_exec /usr/sbin/dropbear /usr/sbin/
copy_exec /usr/bin/passwd /usr/bin/
copy_exec /bin/login /bin/
copy_exec /usr/bin/killall /usr/bin/
copy_exec /sbin/route /sbin/
copy_exec /usr/bin/awk /usr/bin/
#copy_exec /usr/bin/strace /usr/bin/
#copy_exec /bin/nc /bin/

# some librarys are not autoincluded by copy_exec
copy_exec /lib/libnss_compat.so.2 /lib/
copy_exec /usr/lib/libz.so.1 /usr/lib/
copy_exec /etc/ld.so.cache /etc/
copy_exec /lib/libutil.so.1 /lib/

# we copy config and key files
cp -pr /etc/dropbear/dropbear_dss_host_key ${DESTDIR}/etc/dropbear/
cp -pr /etc/dropbear/dropbear_rsa_host_key ${DESTDIR}/etc/dropbear/
cp -pr /etc/passwd ${DESTDIR}/etc/  
cp -pr /etc/shadow ${DESTDIR}/etc/
cp -pr /etc/group ${DESTDIR}/etc/
if [ -e /root/.ssh/authorized_keys ]
then
 cp -pr /root/.ssh/authorized_keys ${DESTDIR}/root/.ssh/
fi
cp -pr /etc/nsswitch.conf  ${DESTDIR}/etc/
cp -pr /etc/localtime  ${DESTDIR}/etc/
cp -pr /lib/tls ${DESTDIR}/lib/
# we don't have bash in our initrd 
# also we only add the root account
cat  /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > ${DESTDIR}/etc/passwd   
cat  /etc/shadow | grep root > ${DESTDIR}/etc/shadow   
cat  /etc/group | grep root > ${DESTDIR}/etc/group  

cat >${DESTDIR}/scripts/local-top/network_ssh << 'EOF'
#!/bin/sh

# we start the network and ssh-server

PREREQ=""
prereqs()
{
 echo "$PREREQ"
}

case $1 in
prereqs)

 prereqs
 exit 0
;;
esac

# Begin real processing below this line

# build up helpful environment
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir --mode=0700 /root
[ -d /tmp ] || mkdir /tmp
[ -d /sys ] || {
 mkdir /sys
 mount -t sysfs -o nodev,noexec,nosuid none /sys
}
[ -d /proc ] || {
 mkdir /proc
 mount -t proc -o nodev,noexec,nosuid none /proc

}

mkdir -p /var/lock
mkdir -p /var/log
touch /var/log/lastlog
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts


################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs 
ifconfig eth0 192.168.17.133 netmask 255.255.255.0
route add default gw 192.168.17.1
################# CHANGE THE LINES ABOVE #################


# If you like to use dhcp make sure you include dhclient or pump in 
# /etc/initramfs-tools/hooks/dropbear via
#	 copy_exec /sbin/dhclient


# for debugging ssh-server you may run it in forgound  
#	  /usr/sbin/dropbear -E -F
# for more debugging you may run it with strace
# therfor you have to include strace and nc at top of 
# /etc/initramfs-tools/hooks/dropbear via
#	copy_exec /usr/bin/strace
#	copy_exec /usr/bin/nc
# then start nc on an other host and run
#	 /usr/sbin/dropbear -E -F  2>&1 | /bin/nc -vv <ip of other host> <nc port of other host>   
#	 e.g.: 
#	 /usr/sbin/dropbear -E -F  2>&1 | /bin/nc -vv 192.168.1.2 8888   

# We will use /dev/urandom because /dev/random gets easily blocked
mv /dev/random /dev/random.old
ln -s /dev/urandom /dev/random
/usr/sbin/dropbear -E -F -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
ls -al
rm -f /dev/random
mv /dev/random.old /dev/random
EOF
chmod 700 ${DESTDIR}/scripts/local-top/network_ssh

cat >${DESTDIR}/etc/dropbear/banner << 'EOF'

 To unlock root-partition run
	unlock


EOF

# script to unlock luks via ssh 
# dirty but effektive 
cat >${DESTDIR}/usr/bin/unlock << 'EOF'
#!/bin/sh

/bin/sh /scripts/local-top/cryptroot

# Kill processes locking boot process 
[ `ls /dev/mapper/ | grep -v control| wc -l | awk '{print $1}'` -gt 0 ] && {
 for i in `ps | grep -E "cryptroot|cryptsetup" | awk '{ print $1 }'`
 do
kill $i
 done
}
/bin/sh /scripts/local-bottom/rm_dropbear
EOF

chmod 700 ${DESTDIR}/usr/bin/unlock

# make sure we exit dropbear at the end of the startup process
cat >${DESTDIR}/scripts/local-bottom/rm_dropbear << 'EOF'
#!/bin/sh
PREREQ=""

prereqs()
{
 echo ""
}

case $1 in
prereqs)

 prereqs
 exit 0
;;
esac

# Begin real processing below this line
# we kill dropbear ssh-server 

/usr/bin/killall dropbear

EOF
chmod 700 ${DESTDIR}/scripts/local-bottom/rm_dropbear

Voilà le script qui marche sur Debian ...

pour toutes question, n'hésitez pas !!

PS: je regarde pour intégrer le calcul du hash md5, n'en déplaise à Aefron ^^

Si j'ai du temps un autre jour, je regarderai pour pousser un peu plus la sécurité.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...