[ Jbyn4e @ 01.04.2009. 12:54 ] @
Scenario - potrebno je shell script-om prebaciti fajlove na server.

Potrebno je obezbediti da se mozemo logovati na udaljenu masinu bez lozinke. Zbog toga moramo napraviti svoj tajni i javni kljuc za povezivanje ssh protokolom (koga koriste scp/sftp klijenti). To cemo uraditi komandom ssh-keygen koja dolazi uz openssh paket mnogih linux distribucija (ako ne i svih):

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sf/.ssh/id_rsa):
Created directory '/home/sf/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sf/.ssh/id_rsa.
Your public key has been saved in /home/sf/.ssh/id_rsa.pub.
The key fingerprint is:
...

Ovim smo napravili tajni (id_rsa) i javni (id_rsa.pub) kljuc. Taj javni kljuc potrebno je uneti u .ssh direktorijum (ne zaboraviti tacku na pocetku), u fajl authorized_keys (ako ne postoji, napraviti ga). Javni kljuc mozete prekopirati sa jedne na drugu masinu na nacin koji vam je najlaksi, ja obicno posaljem scp-om fajl:

# scp .ssh/id_rsa.pub [email protected]:

Ne zaboravite da treba da stoji dvotocka iza imena servera, pa putanja koju zelite.
i nakon toga otici na server i kopirati sadrzaj tog fajla u authorized_keys:

# ssh [email protected]
Password: *****
# cat id_rsa.pub>>.ssh/authorized_keys

Postupak za ssh kljuc sa dsa enkripciju je identican, sa malom razlikom sto se umesto rsa koristi dsa (ssh-keygen -t dsa). Ovo sve vazi za ssh protokol verzije 2.

Ovim smo omogucili da uradimo scp ili sftp sa date masine na server. Upotreba:

scp fajl [email protected]:/apsolutna/putanja/naziv_fajla
sftp [email protected]:/direktorijum
pwd
put *.*
quit


Ukoliko server nema scp mogucnosti (primer: windows freesshd), ovo vam moze posluziti za secure prenos fajlova na server, kome ste pre toga dostavili svoj kljuc... u ovom primeru cete u skriptama koristiti sftp za povezivanje sa windows serverom. U slucaju da morate da koristite sftp, koristicete ovako nesto u skriptama:

sftp [email protected]:/nula <<EOF
cd 1
rm *.*
cd ..
cd 2
rm *.*
put *.jpg
quit
EOF

Ovim cete na serveru u direktorijumu /nula/1 i /nula/2 obrisati sve, a potom iz tekuceg direktorijuma prebaciti sve jpeg-ove u /nula/2

Ukoliko nesto nisam ispustio, ovo bi trebalo da je sve.


[ Časlav Ilić @ 02.04.2009. 10:20 ] @
Čini mi se da nije pomenuto da ne treba uneti lozinku pri stvaranju para ključeva (Enter passphrase...). U suprotnom, pri svakom prijavljivanju na udaljeni sistem opet bi morala da se kuca lozinka, lozinka tajnog ključa.

Kad sam to rekao, onda imam dve primedbe.

Prva je da zapravo nije najbolja ideja stvarati i koristiti ključ bez lozinke. Jer ako se neko domogne tajnog ključa, moći će da ga upotrebi za prijavljivanje na udaljene sisteme jednako kao i stvarni vlasnik ključa. Zato treba zadati lozinku za ključ, a pred prvo prijavljivanje na udaljeni sistem izvršiti:
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa

kada će korisnik biti upitan za lozinku, i ona zapamćena tokom trajanja sesije, tako da SSH agent izdaje lozinku umesto korisnika. Pošto eval `ssh-agent` dodaje neke promenljive okruženja, one važe samo u trenutnom prozoru školjke. Zato se može upisati u neku od datoteka koje se uvlače po prijavljivanju (npr. ~/.bash_profile), tako da agent pokriva celu sesiju (ssh-add ... pak mora ručno da se izvrši da bi se unela lozinka, u čemu je i smisao ovoga).

Drugo je da je obično zgodno imati više ključeva, koji se koriste u različite namene, i za pristupe različitim mašinama. Ja npr. imam jedan ključ za opšti pristup mašinama na kojima imam nalog, drugi za pristup riznicama za upravljanje verzijama, itd. Da bi se ovo napravilo, pri ili po stvaranju ključa treba promeniti ime javnog i tajnog ključa na željeno, npr. ~/.ssh/id_rsa u ~/.ssh/id_rsa_riznice i ~/.ssh/id_rsa.pub u ~/.ssh/id_rsa_riznice.pub. Zatim, u ~/.ssh/config treba definisati pristup ciljnim mašinama, zadavši neku opštu ručku, masku domaćina, korisničko ime, ključ koji se koristi, itd. Na primer, ako dodam ovo:
Code:
Host nekidjavo
    Hostname *.nekidjavo.org
    User caslav
    IdentityFile ~/.ssh/id_rsa_riznice

onda mogu mašinama *.nekidjavo.org da pristupam preko ručke, bez navođenja tačne mašine i korisničkog imena:
$ ssh nekidjavo
$ scp ... nekidjavo:...
$ # itd.

Vrlo zgodno, u ~/.ssh/config takođe se može podesiti održavanje veze u životu, u slučaju da udaljena mašina prebrzo obustavlja vezu pri mirovanju korisnika:
Code:
Host ...
    ...
    ServerAliveInterval 60
    ServerAliveCountMax  3

Prva opcija određuje na koliko sekundi se udaljenoj mašini šalje poruka za održavanje veze, a druga posle koliko neisporučenih takvih poruka treba odustati (u slučaju da je udaljena mašina otišla van veze).
[ Jbyn4e @ 02.04.2009. 10:53 ] @
Svaka cast Caslave na objasnjenju - nisam toliko zalazio u detalje, a i da, zaboravio sam da napomenem da se ne unosi passphrase. Ovo sto si ispricao za razlicite kljuceve je zanimljivo, kao i ssh-agent (nisam koristio dosad) i ssh-add, pa i alias na ime (pretpostavljam da je to ono sto zoves "rucka").

Imas li neki primer kako se moze "domoci" tajnog kljuca? Pretpostavljam da to vazi za neke "shared" hostinge sa ssh pristupom? Mada, .ssh direktorijum je pod 700 privilegijama, i ne znam da li moze neko da pristupi tajnom kljucu osim vlasnika istog?

Dakle, sa pitanja sigurnosti komunikacije, da li je moguce nekim sniff-anjem da se "zapise" tajni kljuc u trenutku uspostavljanja ssh veze?

Btw. kad smo vec kod teme, ukoliko zelite da ogranicite korisnika samo na sftp, stavite ga u grupu recimo sftponly, a u sshd_config servera definisite nesto ovako (vazi za openssh verzije mislim 4.4 pa navise odakle je Match direktiva postala upotrebljiva):

Citat:

Subsystem sftp internal-sftp

Match Group sftponly
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no


Ovako ce korisnik moci da koristi samo sftp, i umesto njegovog /home/username direktorijuma videce ga kao / (root) i nece moci da "prcka" po sistemu (tj. bice "chroot"-ovan na svoj home).
[ Časlav Ilić @ 02.04.2009. 11:14 ] @
Citat:
Jbyn4e: [...] pa i alias na ime (pretpostavljam da je to ono sto zoves "rucka").


Jeste, alijas. Nisam mogao da se setim u trenutku pa lupih prvo što mi je palo na pamet :)

Citat:
Imas li neki primer kako se moze "domoci" tajnog kljuca? [...]


Nemam nikakve primere, kako da kažem, administratorske, nego čisto s korisničke strane. Manje bitno, upravo su adminima svi moji ključevi na izvolte (mada me ništa ne spase od admina, naravno, može glat da presretne ovo sa SSH agentom ako je zapeo), i bitnije, ako izgubim sistem s tajnim ključevima na njemu (npr. laptop).