Portál AbcLinuxu, 30. dubna 2025 11:14

SSH kluce na usb flashdisku

14.9.2006 11:07 | Přečteno: 1629× | poslední úprava: 14.9.2006 11:44

Obcas sa potrebuje kazdy z nas pripojit na nejaky vzdialeny stroj pomocou ssh. Ja osobne na dva. Z prace domov, z prace k priatelke na server a z domu k priatelke na server.
Kedze stroje su verejne dostupne a logy sa plnili hlaskami o zlom hesle, moja paranoia zacala gradovat. Pristupil som teda k ciastocnej eliminacii rizik, zakazal som password loginy, povolil login len na svoje konto a to len pomocou kluca. To so sebou prinieslo ale dalsiu nevyhodu, ktorou je skladovanie tohoto kluca. Doma s tym problem nemam, ale v praci?
Tak som si kluc presunul na usb flash disk, ktory som mal vzdy zastrceny v kompe, ked som sa potreboval niekam pripojit. Samozrejme, ked som siel na obed, alebo dlhsie mimo kompu, kluc som braval so sebou. A to znamenalo neustale mounty, unmounty, linky, unlinky. Prestavalo ma to bavit, najma preto, ze to cele bolo okorenene tym, ze som stale musel zadavat heslo ( nie som samovrah, kluc je samozrejme zaheslovany ).

To ma dozralo a zacal som skumat, ako na to. SSH pouzivam uz roky rokuce a par krat som pocul nieco o nejakom tajuplnom ssh agentovi, ale nikdy som sa nedokopal k tomu, aby som ho trosku nastudoval. Tak som sa do toho pustil.

Prve, co ma napadlo, bolo ps ax | grep agent. A hu-ha, on uz bezal ( zistil som, ze od startu X, alebo KDE ). Vyskusal som spustit prikaz ssh-add /media/myusbkey1/keys/id_dsa_msk. Vypytal si heslo ku klucu, ktore obratom obdrzal. Nasledne spojenie ku mne domov prebehlo bez hesla. Zajasal som radostou. Huraaaaa, mam to! A tak sa moja diskoteka s usb klucom obmedzila na ranne pripojenie usb-cka, mount, ssh-add, heslo, umount. Ked som siel od kompu, stacilo ssh-add -x + nejake heslo. Samozrejme ako kazdy rypal, musel som to este nejak vylepsit. Co-to som uz pocul o udev, ved ked ten usb kluc strcim do kompu, rozsvieti sa mi pekna modra ikonka usb disku na paneli ( KDE ). A tak som si vymyslel dalsi scenar: rano pridem do prace, strcim tam usb kluc, agent si sam kluce naimportuje a ja mozem usb disk odpojit a cely den si uzivat bezhesloveho pristupu.

Takze som zacal studovat udev a moznost spustania scriptov pri urcitych eventoch. S udev som sa potrapil, pretoze ani jeden navod, ktory som nasiel na automount usb klucov, u mna nezafungoval. Po case som zistil, ze som vlastnikom usb klucenky, ktora odmieta oznamit svoje SYSFS{serial}. Vygooglil som teda sposob, akym to obist a pokracoval som vo "vyvoji" mojho prveho udev-rule.
KERNEL="sd*", SYSFS{vendor}="Corsair", SYSFS{model}="Flash*Voyager*", NAME{all_partitions}="myusbkey%n" RUN+="echo lama > /tmp/lama"
Po prvotnom uspechu, ktory sa prejavil tym, ze po vlozeni usb klucenky sa mi v /dev/ objavili zariadenia mysubkey* a v /tmp sa objavil subor lama s rovnakym obsahom, som zacal premyslat, ako to vyuzit tak, aby na mna v Xoch vyskocilo okno a vypytalo si heslo. Najprv som spekuloval s pythonom a qt, kym som si poriadne neprecital manual k ssh-add a nenarazil v nom na zmienku o SSH_ASKPASS. A za par desiatok minut bol na svete tento script:
#!/bin/sh

# create new file in /etc/udev/rules.d with similar content ( RUN+= must stay!! )
#KERNEL="sd*", SYSFS{vendor}="Corsair", SYSFS{model}="Flash*Voyager*", NAME{all_partitions}="myusbkey%n" RUN+="/home/msk/bin/import_ssh_key.sh signalize" GROUP="your_login"

# on which device keys are
KEYPARTITION="myusbkey1"

# path to keys ( from media root, separated by ',' )
KEYS="keys/id_dsa_key1,keys/id_dsa_key2"		# kluce mam na /media/myusbkey1/keys

# time of sleep between checks
SLEEPTIME=10

# your login
USERNAME="msk"

# binary of ssh_askpass
ASKPASS_BIN=/usr/bin/ssh-askpass-fullscreen



PIPEFILE=/tmp/keys_pipe


if [ "$1" == "signalize" ]; then
	# send signal
	echo "MYUSBKEY_INSERTED:$DEVNAME" > $PIPEFILE
	# and change ownership, because we was called from udev as root
	chown $USERNAME $PIPEFILE

else

	# create pipe signalization file
	rm -f $PIPEFILE

	# endless cycle
	while true; do

		if [ -e $PIPEFILE ]; then	

			# get content of pipe file
			MSG=$(cat $PIPEFILE)
		
			# test if contains message from udev
			TST=$(echo $MSG | grep "MYUSBKEY_INSERTED:/dev/$KEYPARTITION" | wc -l)
			if [ "$TST" != "0" ]; then
	
				# mount device
				pmount $KEYPARTITION
		
				# for all configured keys
				IFS=,
				export SSH_ASKPASS=$ASKPASS_BIN
				for key in $KEYS; do
					KEYPATH=/media/$KEYPARTITION/$key
					# check if key isn't already loaded
					if [ "$(ssh-add -l | grep $KEYPATH | wc -l)" == "0" ]; then
						# add key
						ssh-add $KEYPATH < /dev/null
					fi
				done
	
				# umount device
				pumount $KEYPARTITION
	
				# done
				> $PIPEFILE
	
			else
				# no signal from udev, sleep
				sleep $SLEEPTIME
			fi
		fi
	
	done

fi
V /etc/udev/rules.d vznikol novy subor 99-myusbkey.rules s nasledovnym obsahom:
KERNEL="sd*", SYSFS{vendor}="Corsair", SYSFS{model}="Flash*Voyager*", NAME{all_partitions}="myusbkey%n" RUN+="/home/msk/bin/import_ssh_key.sh signalize" GROUP="msk"
Pokial netrpite podobnym problemom s usb klucenkou ako ja, pouzite SYSFS{manufacturer} a SYSFS{serial} ( namiesto vendor a model ) podla navodov dostupnych po celom Internete.

V KDE autostart spravte link na import_ssh_key.sh tak, aby sa spustil po logine do KDE ( pripadne ineho wm ). Script bude bezat na pozadi a v pripade, ze sa vlozi usb klucenka, pokusi sa naimportovat kluce uvedene v $KEYS. Heslo si vypyta pomocou fulscreen dialogu ( aptitude install ssh-askpass-fullscreen ), ssh askpass je mozne zmenit v $ASKPASS_BIN.
Povodne som script napisal tak, aby s udev komunikoval pomocou fifo ( a nemuselo by sa cyklicky sleepovat, predsa to zere trosicku vykonu, ale asi zanedbatelne ), ale dochadzalo k deadlockom ( pokial nahodou na druhej strane fifo nikto nepocuval ), na ktorych udev ostal vysiet. Takze som z fifo spravil obycajny textovy subor, na ktorom udev nemoze ostat vysiet a 10 shell instrukcii za 10 sekund je asi v pohode :o).

Tak a teraz idem zasuvat a vysuvat, pomedzi to budem robit ssh-add -D a uzivat si svoje veldielo :o)
Snad sa to niekomu hodi...

Pokial niekto vie o nejakom systemovejsom rieseni, popiste ho v diskusii.        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

14.9.2006 11:21 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Odpovědět | Sbalit | Link | Blokovat | Admin
Všechno je to moc pěkné, také jsem si takhle hrál, než jsem zjistil, že s jiným jádrem může být všechno jinak. Ted už na to peču. Když potřebuji něco z nějakého usb zařízení, tak si preventivně nejdřív vypíšu
cat /proc/partition
a pak to raději mountuju ručně.
msk avatar 14.9.2006 11:29 msk | skóre: 27 | blog: msk
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
No jo, ale ked ja to pouzivam na 2 strojoch s identickym jadrom a distribuciou, tak je to v pohode.
msk avatar 14.9.2006 11:22 msk | skóre: 27 | blog: msk
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Odpovědět | Sbalit | Link | Blokovat | Admin
Este som zabudol dodat: chcel by som nieco podobne spravit s openvpn-kovymi certifikatmi ( strcim usb, vypyta si heslo, nahodi vpn ). Tusite niekto, ci by sa na to dal nejak zneuzit ssh agent, pripadne kwallet?
msk avatar 14.9.2006 11:45 msk | skóre: 27 | blog: msk
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Odpovědět | Sbalit | Link | Blokovat | Admin
Ehm, trosku nepozornosti a uz je tu druha uprava scriptu :o). Pridal som test, ci existuje pipefile a odstranil -c zo ssh-add, pretoze necitam poriadne manualy :o)
14.9.2006 12:03 Jan Kundrát (jkt) | skóre: 27 | blog: jkt | Praha - Bohnice
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Odpovědět | Sbalit | Link | Blokovat | Admin
No, ja osobne pouzivam pam_ssh, kteryzto umi heslem zadanym pri loginu "odemknout" ssh klic, ktery je pravda stale ulozen v ~. Bohuzel jsem jeste nenasel pam_gpg a byl jsem liny si ho napsat sam :).
Blésmrt
14.9.2006 12:55 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Odpovědět | Sbalit | Link | Blokovat | Admin
par veci k bashu

1.)
# path to keys ( from media root, separated by ',' )
KEYS="keys/id_dsa_key1,keys/id_dsa_key2"
oddeloval by som to medzerou, potom sa netreba srat s prenastavovanim IFS

2.)
# get content of pipe file
MSG=$(cat $PIPEFILE)
		
# test if contains message from udev
TST=$(echo $MSG | grep "MYUSBKEY_INSERTED:/dev/$KEYPARTITION" | wc -l)
if [ "$TST" != "0" ]; then
da sa to nahradit
if grep -q "MYUSBKEY_INSERTED:/dev/$KEYPARTITION" "$PIPEFILE"; then
3.)

namiesto kazdych 10 sekund sa pokusat citat subor, sa da nieco ako
tail -f "$PIPEFILE" |
while true; do
    read msg
    dosomething "$msg"
done
vtedy sa uz ale neda grepovat priamo subor, ale musi sa cez to echo
if echo "$msg" | grep -q "MYUSBKEY_INSERTED:/dev/$KEYPARTITION"; then
If you hold a Unix shell up to your ear, you can you hear the C.
msk avatar 14.9.2006 14:32 msk | skóre: 27 | blog: msk
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Priznam sa, ze s tym tail ma to vobec nenapadlo. A pritom ho pouzivam denne :o). Dik za tip.
10.5.2011 23:11 lukas
Rozbalit Rozbalit vše Re: SSH kluce na usb flashdisku
Odpovědět | Sbalit | Link | Blokovat | Admin
Zdravím, potreboval by som pomôcť. V ubuntu, na jednej pracovnej stanici si chccem zriešiť prostredníctvom vmware ubuntu server (inú možnosť zatiaľ nepoznám), potrebujem aby ubuntu komunikovalo s ubuntu serverom, pretože mám k dispozícii token ikey2032, na ktorom budem mať certifikát, kľúč atď, ďalej chcem vyriešiť prihlásenie do ubuntu prostredníctvom spomínaného tokenu a to tak, že párový kľúč slúžiaci k autentifikácii bude uložený na strane servera a po zastrčení tokenu do usb portu táto auatentifikácia prebehne a následne by som mal byť prihlásený v ubuntu. Vopred ďakujem, za každú pomoc.. :)

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.