====== Hints ====== * Pour pousser une clef, il y a la commande //ssh-copy-id// c'est plus simple * (cf droits'n co sur le //~/.ssh/authorized_keys//) * ou [[http://www.ir.bbn.com/~gdt/ir-account/]] (FreeBSD et NetBSD) et sa commande extract-account. * Lors de la création d'une clef Ssh songer a utiliser le parametre -C avec la cmd //ssh-keygen// * Un jour explorer le comportement du fichier //~.ssh/config// * Cf [[http://www.admin-linux.fr/?p=323]] * Pour jouer une commande sur plusieurs noeuds en meme tps : [[http://www.garbled.net/clusterit.html|ClusterIt]] (merci Pascal) * Un peu de port fowrding //ssh -f user@domaine.tld -L 3128:Proxy:3128 -N// * Encore des infos... http://www.dbsysnet.com/restriction-des-commandes-ssh-sur-cles-publique-privee/ * Utiliser, avec putty un socks proxy [[https://www.digitalocean.com/community/tutorials/how-to-route-web-traffic-securely-without-a-vpn-using-a-socks-tunnel]] * Lors de multiples reinstall, ne pas avoir a nettoyer le known_host, etc. ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@hostname/IP-address ===== var d'env ===== * Dans certains cas l'env de l'user ne se chargera pas comme on l'attend, donc : * Au niveau Serveur cat <> /etc/ssh/sshd_config # Load User environment file ~/.ssh/environment PermitUserEnvironment yes EOF * Au niveau user cat <>~/.ssh/environment PATH=~/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games END ===== ssh-agent ===== ==== Gestion des sessions ssh ==== * Pour finir la session ssh-agent: * //ssh-add -D// * //ssh-add -t 36000// (merci Arnaud) * [[http://www.funtoo.org/wiki/Keychain|keychain]] (merci Pascal) cat ~/.profile keychain --agents ssh -Q -q --timeout 40 id_rsa ... [ -f $HOME/.keychain/$HOSTNAME-sh ] && . $HOME/.keychain/$HOSTNAME-sh et un script à lancer régulièrement : #!/bin/ksh # $Id: key,v 1.12 2011/07/26 15:15:24 pc Exp $ IFS="^M" export IFS pc_key=${HOME}/.ssh/id_rsa keys=$(ssh-add -l) echo ${keys} |egrep "${pc_key}\>" > /dev/null if [[ $? -eq 1 ]]; then echo "Chargement de la clef $pc_key pour 1200s (20mn) :" ssh-add -t 1200 ${pc_key} ssh-add -l else echo "La clef ${pc_key} est chargée ; clef(s) actuellement chargée(s) :" echo ${keys} fi Pour utiliser avec X11, il faut comprendre que ssh-agent(1) doit propager les variables d'environnement (aux processus fils) => renommez vos .xsession en .SessionX et remplacez par : $ cat .xsession exec ssh-agent /users/pc/.SessionX ssh-agent -k $ .SessionX ... SSH_ASKPASS=/usr/pkg/bin/x11-ssh-askpass export SSH_ASKPASS ... eval 'keychain -Q -q --timeout 40 $HOME/.ssh/id_rsa' . $HOME/.keychain/${HOST}-sh ... ==== Ssh clef Forwarding ==== * SSH fait de l'agent forwarding avec l'option -A * ainsi on peut rebondir sans avoir à placer la clef (ssh-agent doit etre lancé sur son poste) * ATTENTION: toute personne pouvant lire votre fichier d'"auth sock" peut utiliser votre tunnel pour s'authentifier à votre place. * il lui suffit de cfg la var d'env SSH_AUTH_SOCK (par defaut: /tmp/ssh-XXXXXXX/agent.PID) sur votre sock... (merci Adrien) ===== Qui c'est connecte avec une clef ssh ===== Bon, j'avais le besoin de savoir quelle clef avait été utilisée pour se loguer sur un serveur et donc d'avoir un peu plus d'informations... Dans les faits il y a des infos dans le /var/log/auth.log mais... ce n'est pas amusant pour recouper avec la clef publique utilisée... Voici donc ce que j'ai commis : #!/bin/bash grep ": Accepted publickey for " /var/log/auth.log | tr -s "\t " " " | cut -d" " -f1-4,9,11,13,15,16 | while read d1 d2 d3 d4 login ip port rsa cles do holo=$(getent passwd $login | cut -d: -f6) grep -v "^#" $holo/.ssh/authorized_keys | sed -s "s/.*\(ssh-.*\)/\1/g" | sort -u | ssh-keygen -lf - | while read null clef com do if [ "$cles" = "$clef" ]; then echo $d1 $d2 $d3 $d4: $login $ip:$port $com fi done done Et ça rend à peu près ça Jun 4 09:24:0 2 wurzel: adlp 10.a.b.c:55156 adlp@TAFF (RSA) Jun 5 08:50:22 wurzel: adlp w.x.y.z:55918 adlp@TAFF (RSA) Jun 5 13:50:26 wurzel: adlp 10.a.b.c:46410 adlp@TAFF (RSA) Jun 6 08:27:54 wurzel: adlp w.x.y.z:48496 adlp@TAFF (RSA) ====== Limiter les ayants droits ====== ===== Authorisation par groupes ===== La methode la plus simple consiste a creer un groupe (**client-ssh**), et y mettre les utilisateurs qui auront le droit de faire du ssh Et modifier ainsi le **/etc/ssh/sshd_config** AllowGroups client-ssh ===== Authorisation par groupes, la suite ===== Dans certains cas on peut avoir besoin d'accorder des autorisations distinctes en fonction du reseau de provenance, et qui plus est etre plus restrictif vis a vis de l'Internet. ''**Cas concret**: Autoriser le //scp// pour certains users coté Internet, et autoriser coter LAN le //shell//'' A savoir: - Par defaut on essaye d'etre restrictif, puis on ouvre - Il est autement recommandé que les users scp aient le droit de faire du ssh... - Les configuration sont lut sequentiellement par le ssh - Sequentiellement, mais cumulable... AllowGroups client-ssh ChrootDirectory /tmp AllowAgentForwarding no AllowTcpForwarding no Banner no MaxAuthTries 2 PermitEmptyPasswords no X11Forwarding no Match Address 10.0.0.0/8,192.168.0.0/16,172.16.0.0/12,127.0.0.1/32 ChrootDirectory none AllowAgentForwarding yes AllowTcpForwarding yes X11Forwarding yes Match Group client-scp ChrootDirectory none ForceCommand internal-sftp AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no ===== Etre plus specifique sur une clef ===== Ainsi on pourra specifier les commandes authorisés, les origines de cnx... Exemple (issue de la man page quand meme...) # Comments allowed at start of line ssh-rsa AAAAB3Nza...LiPk== user@example.net from="*.sales.example.net,!pc.sales.example.net" ssh-rsa AAAAB2...19Q== john@example.net command="dump /home",no-pty,no-port-forwarding ssh-dss AAAAC3...51R== example.net permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-dss AAAAB5...21S== tunnel="0",command="sh /etc/netstart tun0" ssh-rsa AAAA...== jane@example.net FIXME exemple a reprendre d'un truc deja mis en prod... (merci Pascal) En voilà un pour rebondir depuis une passerelle : command="/bin/sh -c '/usr/bin/ssh -l pc internal ${SSH_ORIGINAL_COMMAND}'" ssh-rsa AAA... En voici un autre pour SVN : command="/usr/pkg/bin/svnserve -t --tunnel-user=pc -r $HOME/depot\"$@\"",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB... ====== Chrooter les ayants droits ====== [[http://www.pizzashack.org/rssh/|Voir aussi ce que sait faire rssh]] (merci Pascal) Ici seront chrootés les users du groupe **www-users** ===== Cfg sshd ===== Toujours dans **/etc/ssh/sshd_config**, rajouter : Match Group www-users ChrootDirectory %h # ForceCommand internal-sftp AllowTcpForwarding no NB: on peut reproduire cette conf a plusieurs reprise.. ===== Cfg user ===== FIXME: En gros il faut une buzybox avec les liens adequates + si prg supplementaires, ne pas oublier de faire des ldd dessus... ===== Creation de l'environement chrooté ===== NB: c'est tout de meme plus simple que le "ChrootDirectory" pointe vers un meme repertoire pour tout les utilisateurs... Le Script ci-joint a pour objectif de valider: * Que les lib necessaire au bon fonctionnement des binaires positionnés dans le chroot sont là * Qu'il n'y a pas de lib en trop * Que les lib et binnaires soient à jour par rapport a ceux accessibles dans le $PATH de la machine #!/bin/bash REPCHROOT=/home-chroot # Objectif # .Verifier qu'il y a toutes les libs # .Verifier que les lib et les binnaires sont uptodate # Evidement, signalera des erreures sur les cas particuliers # Fichiers speciaux pr le chroot TMP=/tmp/vert-$$ find $REPCHROOT/lib/ -maxdepth 1 -type f | sort | while read lib ;do basename $lib; done | tr -s "\n" " " >$TMP find $REPCHROOT/bin/ -type f -exec ldd '{}' \; | awk '{ print $3 }' | grep lib | sort | uniq | while read lib do BNL=`basename $lib` sed -i "s/$BNL//g" $TMP if [ -e $REPCHROOT$lib ]; then NBL=`md5sum $REPCHROOT$lib $lib | awk '{ print $1 }' | uniq | wc -l` if [ $NBL -eq 1 ]; then echo OK:$lib::md5sum $REPCHROOT$lib $lib else echo KO:$lib:not uptodate:md5sum $REPCHROOT$lib $lib fi else echo KO:$lib:not here fi done sed -i "s/ //g" $TMP if [ -s $TMP ]; then echo NOK:too much lib in chroot:`cat $TMP` else echo OK:lib are just fine fi rm $TMP find $REPCHROOT/bin/ -type f | while read bin do BNF=`basename $bin` CHC=`which $BNF` if [ ! -z "$CHC" ]; then NBL=`md5sum $bin $CHC | awk '{ print $1 }' | uniq | wc -l` if [ $NBL -eq 1 ]; then echo OK:$bin:md5sum $bin $CHC else echo KO:$bin not uptodate:md5sum $bin $CHC fi else echo KO:$bin:not here fi done ====== Le Umask et le ssh ====== ===== Anciennement ===== * La bonne doc est la : [[http://serverfault.com/questions/228396/how-to-setup-sshs-umask-for-all-type-of-connections|How to setup ssh's umask for all type of connections]] * Il suffit betement de suivre un truc qui est bien documenté dans la man page de **pam_umask** (avec un usage interessant du gecos) On edite le fichier **/etc/pam.d/sshd:** et on rajoute ca : # Setting UMASK for all ssh based connections (ssh, sftp, scp) session optional pam_umask.so umask=0027 NB apres, si on est joueur on eut faire ca : sudo chfn -o "umask=002" daemon_username ===== Et maintenant ===== Pour faire uniquement du sftp... chrooté avec positionnement de umask, on peut désormais faire plus simple : [[http://en.wikibooks.org/wiki/OpenSSH/Cookbook/SFTP]] A noter que si l'on utilise pas la solution de chroot intégrée évoquée ici, il faut ajouter le device log du chroot au niveau de la config de son syslog préféré si on veut avoir un peu de logs ;-) (merci à Jean-Yves) ====== Les Tunnels ====== * http://openclassrooms.com/courses/mise-en-place-d-un-tunnel-tcp-ip-via-ssh ===== Report de port ===== ssh -L 8080:localhost:80 utilisateur@serveurdistant Cela permettra de faire apparaitre sur le port 8080 de la machine local le port 80 de la machine "serveur distant" ===== Le revert tunnel ===== * Copié collé a l'arrache d'un super site pour ne pas le perdre : [[http://geekfault.org/2011/02/19/reverse-ssh-acceder-a-un-serveur-derriere-un-natfirewall/]] AllowTcpForwarding yes distant$ ssh -NR 22222:localhost:22 user@local local$ ssh -p 22222 user@127.0.0.1 # autossh -i /path/to/privateKey.rsa -NR 22222:localhost:22 user@local ==== Machine Cachée derriere le FW ==== === Initialisation === * Configuration du sshd : **AllowTcpForwarding yes** * Generation de la clef Pas besoin de refaire une lecon : ssh-keygen.... * Copie de la clef Utiliser ssh-copyid, en precisant la meme syntax que celle appelée par la suite, ici rebond@rebond.adlp.org * Test ssh -NR 22000:localhost:22 rebond@rebond.adlp.org === Automatisation === * Creation du fichier **/etc/init/autossh.conf** # autossh - tunnel # # This service maintain a ssh tunnel to the maintenance center start on stopped rc RUNLEVEL=[2345] and ( not-container or container CONTAINER=lxc or container CONTAINER=lxc-libvirt) stop on runlevel [!2345] respawn exec /bin/su - rebond -c "/usr/bin/autossh -i /home/rebond/.ssh/id_rsa -NR 22000:localhost:22 rebond@rebond.adlp.org" ==== Machine de rebond ==== local$ ssh -p 22000 user@127.0.0.1 ===== Les tunnels socks ===== * Important : c'est un repompage sans aucune honte d'un site que j'aime beaucoup : [[https://david.mercereau.info/autossh-tsocks-tunnel-socks-permanent/]] ====== SshFs ====== * [[http://doc.ubuntu-fr.org/sshfs|Doc Ubuntu sur le SshFS]] ===== Montage ===== sshfs user@machine.distante:MesDocuments/Video ~/MesDocuments/Video Si le user distant a un uid different du local, est recommandé cela : sshfs -o uid=xxxx -o gid=yyyy [user@]host:[dir] mountpoint [options] ===== Démontage ===== fusauto ~/MesDocuments/Video