VNC:n käyttöönotto



VNC: Virtual Network Computing, kehittänyt AT&T Laboratories, Cambridge. Nykyään VNC:tä kehittää kaupallinen firma nimeltään RealVNC jonka kotisivu löytyy osoitteesta http://www.realvnc.com/ . VNC on ohjelmisto, jolla tietokonetta voi etäkäyttää graafisesti. X Windowing System on ollut toki olemassa jo toistakymmentä vuotta ellei kauemminkin ja sillä konetta voi etäkäyttää graafisesti, sehän on arkipäivää. VNC menee kuitenkin pari askelta pidemmälle. Siinä, missä X toimii lähinnä vain Unixissa ja Unixin johdannaiskäyttöjärjestelmissä, VNC toimii ainakin Unixissa ja Unixin johdannaisissa, Windowsissa, MacOS:ssa, Amigassa, Nokian 9110-kommunikaattorissa ja ties missä muissa, lähdekoodi kun on saatavilla. Lisäksi VNC ei toimi vain esim. välillä Unix-Unix tai Windows-Windows, vaan mistä tahansa mihin tahansa. Linux-Windows, Windows-Solaris, NetBSD-Amiga, U name it. Lisäksi, jos käyttää X:ää ja päätepää sattuu kaatumaan tai täytyy sulkea, kaikki istunnon ohjelmat menevät pois. VNC:llä ohjelmat pysyvät käynnissä niin kauan kuin serveripää pysyy pystyssä eikä VNC-serveriä suljeta. Tästä lisäetuna tulee vielä se, että istuttuaan koneen A ääressä henkilö voi laittaa VNC:n kiinni, siirtyä koneelle B ja avata VNC:n sinne ja saa työpöytänsä koskemattomana mukaansa. Huonona puolena on se, että VNC:n tietoturva on samaa luokkaa telnetin kanssa eli tietoturva on kehno! Kaikki näppäinpainalluksesi menevät verkossa salaamattomina ja ovat hyvin, hyvin helposti salakuunneltavissa. Tämä mielessä aina VNC:tä käyttäessäsi. Jokainen salasana, jokainen sähköposti, jonka VNC-yhteyden yli kirjoitat, kulkee verkossa salaamattomana. Tämä saadaan kuntoon tunneloimalla VNC SSH:n sisään. Ohje siihen
 

Let's laitetaan homma käytäntöön. Esimerkkinä on Fedora Core 2:a pyörittävä Linux-kone, jota halutaan etäkäyttää Windowsista. Linux-koneen root on toivottavasti tehnyt seuraavat toimenpiteet:
-asentanut VNC-serverin, löytyy Fedoran asennuspuusta, vncserver-xxxxxxx.rpm
-avannut palomuurista portin 22, SSH.

Jos nuo ovat kunnossa, käyttäjä Nano Nano voi istuutua Windows-koneellensa ja ottaa SSH-yhteyden Linux-serveriin. SSH:sta nykyaikana pitäisi käyttää vain versiota 2. SSH2:n ymmärtämäksi pääteohjelmaksi Windowsille käy vaikkapa nähtävästi hyväksi havaittu PuTTY. PuTTYyn Host Nameksi Linux-koneen täydellinen nimi tai IP-osoite, protokollaksi SSH. Shellissä käyttäjä sanoo "vncserver" joka havaitessaan tämän olevan ensimmäinen käyttökerta kysyy ensin salasanan ja kahteen kertaan ja salasanan pitää olla kuusimerkkinen tai pidempi. Tämä salasana on käytössä kun VNC-serveriä aletaan etäkäyttää. Turvallisuusvinkki: Kannattaa laittaa eri salasana kuin Linux-käyttäjätunnukseen, jotta mahdollisella murtautujakandidaatilla olisi mahdollisimman paljon kapulia rattaissa. Kun VNC on saanut käyttäjältä hyväksi havaitsemansa salasanan, itse VNC-serveri käynnistyy. Siitä kielivät seuraavanlaiset tekstit:

New 'X' desktop is kone.domain.fi:1

Starting applications specified in /home/nanonano/.vnc/xstartup
Log file is /home/nanonano/.vnc/kone.domain.fi:1.log

Merkille pannaan rivi "New 'X' desktop is", jossa sanotaan VNC-serverin täydellinen osoite.


Seuraavaksi pitää hankkia päätepään ohjelma. Se löytyy jo mainitun linkin http://www.realvnc.com/  takaa, vasemmassa laidassa nappula "download it now". Windowsille saat zip-paketin, josta tarvitsee purkaa vain ohjelma vncviewer.exe. vncviewer käyntiin, niin se kysyy VNC-serverin nimen. Kirjoita nimeksi koko rimpsu mallia kone.domain.fi:1 ja enter, VNCviewer kysyy salasanaa, kirjoita se VNC:n salasana jonka serveriä ensimmäistä kertaa käynnistäessäsi annoit. Jos homma meni putkeen, sait nenäsi eteen ikkunan jossa on VNC-työpöytäsi. Nam.
Yhteys on nyt salaamaton eli jokainen näppäimenpainallus menee verkossa salaamattomana. Vaikka salakuuntelemisen riski labraverkossamme on vain pienehkö, itse en takoisi mitään tärkeitä salasanoja salaamattoman VNC-yhteyden yli (enkä kyllä labroissa muutenkaan, muutama näppäimistöskannausohjelma on jo löytynyt).


Next Step: SSH-tunnelointi.
 

Tässä kohtaa tulee vähän kommervenkkiä. Olen odotellut, josko VNC-vieweristä tulisi versio, jossa on sisäänrakennettu SSH. Sitä kun nyt ei ole, pitää temppu tehdä puTTYllä. Näit siis äsken, että VNC-serveri tuli Linux-serveriin näytöksi :1. Se tietää sitä, että kyseisen VNC-serverin käyttämä portti on 5901, joka pitää nyt pistää puTTYn avulla tunneliin. Koska puTTY ei anna mahdollisuutta määritellä tunnelointia yhteyden ollessa auki, täytyy puTTY käynnistää uudelleen ja määritellä tunnelointi.

Tunneloinnin periaate on, että VNC:n siirtämä data siirretään ikäänkuin tekstipohjaisen yhteyden periaatteella käyttäen SSH:n käyttämiä TCP/UDP-portteja Koska VNC ei enää käytä porttia 590x, ei tule harmia palomuurien kanssa. Serveripää pakkaa ja suojaa datan ja puskee sen SSH-yhteyden käyttämään porttiin. Vieweripäässä tunnelointiohjelma ottaa datan SSH:n portista, kehittää koneeseen uuden TCP/UDP-portin numero 590x, josta normaali, mitenkään muuttelematon VNC-vieweri datan saa. Sama juttu toiseen suuntaan.

Tumasta toimeen. SSH-tunnelointi tehdään tällä kertaa PuTTYllä, koska se Win-koneesta jo löytyy. Ota Puttyllä SSH-yhteys serverikoneeseen. Kirjaudu sisään, käynnistä vncserver. Paina mieleesi VNC-serverin numero (:1, :2 jne.). PuTTY ei näytä antavan mahdollisuutta määritellä tunnelointia yhteyden ollessa olemassa. Käynnistä siis toinen PuTTY. Periaatteena on kirjautua SSH:lla serverikoneeseen, jolloin saadaan SSH authorisoitua, ja samalla tehdään tunnelointi.

By the way, PuTTYn versio on tässä 0.53b. Vanhemmissa tunnelointia ei välttämättä ole. Hae siis riittävän uusi PuTTY. Connection->SSH->Tunnels-välilehdeltä alareunaan kirjoita Source Portiksi se portti, jota haluat viewer-koneessa käyttää, väliltä 5901...590n. Destination-kohtaan serverikoneen tiedot eli IP-osoite tai nimi ja portti, kaksoispisteellä erotettuna. Tässä portti on 5900 + VNC-serverin numero, tätä varten se serverin numero piti muistaa. MUISTA KLIKATA ADD! Saat Forwarded ports-listaan tunneloinnin tiedot. Session-välilehti, ota normaalisti yhteys serverikoneeseen ja kirjaudu sisään. Käynnistä sitten viewer-koneessa vncviewer ja serverikoneen nimen tai IP-osoitteen sijaan kirjoita localhost:n, jossa n on tässä ohjeessa muutamaa riviä aiemmin asettamasi haluamasi portin viimeinen numero. Jos laitoit Source Portiksi 5901, kirjoita vncvieweriin localhost:1 . Siitä normaalisti VNC:llä sisään. Kun VNCViewer aukeaa näyttämään serveriä, voit sanoa PuTTYissa että exit, joka sulkee teksti-SSH-yhteyden. Eipähän jää avonaisia shellejä. Älä kuitenkaan sulje PuTTYä sulkunappulasta, sillä silloin katkeaa myös tunnelointi.



Jos haluat VNC-serveristä eroon, ota vapaa shelli ja kirjoita siihen "vncserver -kill :y", jossa y on VNC-serverisi numero. Jos homma toimii, VNC-viewer katoaa silmänräpäyksessä ja VNC-serveri on mennyttä. Ellei tuo tehoa, voit toki sanoa "killall -9 Xvnc", joka tappaa koneesta kyselemättä kaikki nimissäsi olevat VNC-serverit. VNC-serveri ei tee prosessia nimeltään vncserver vaan Xvnc, koska vncserver on vain scripti, joka antaa Xvnc:lle parametrit ja itse Xvnc jää hoitamaan hommaa. Raa'alla kill-komennolla tappaminen jättää kyllä /tmp-hakemistoon lukkotiedostoja, jotka "syövät" VNC-servereiden portteja ja lukkotiedostot täytyy siivota pois käsivaivalla. Käyttäkää siis komentoa vncserver -kill.


Fedora Core 2:ssa VNC-työpöytä on aika karu, ikkunamanagerina twm ja yksi shell annetaan eväiksi. Muutetaan tämä käyttökelpoisempaan muotoon.

Ensinnäkin varmaan halutaan tehtäväpalkki, start-nappula ynnä muut nykypäivän tilpehöörit. Ne saadaan hyvin helposti, jos työpöytämanageriksi käy Gnome. Jotta Gnome saadaan käynnistymään automaattisesti VNC-serverin kanssa, editoidaan konfiguraatiotiedostoa kotihakemistostasi. Hanki eteesi shelli ja editoi kotihakemistostasi löytyvää tiedostoa ".vnc/xstartup". Huomaa piste, todella ".vnc/xstartup". Sieltä löytyy rivi "twm &". Poista se ja kirjoita tilalle "gnome-session &". Ellet halua sitä tyhmää shelliä auki aina vncserverin käynnistyksessä, poista rivi "xterm ....". Ellet muuta editoria osaa, käytä picoa tai nanoa. "pico -w .vnc/xstartup". -w estää pitkien rivien katkeilemisen. CTRL-x tallentaa. nano toimii just samoin.

Jos VNC-serverin haluaa jättää auki vaikkapa yön ajaksi, kannattaa huomata, että siinä on auki shellejä, taskbar ja yleensäkin kaikki koneen käyttöön tarvittava. Jos murtautuja onnistuu löytämään vnc-serveristä bugin tai saa tietoonsa VNC-salasanasi, hän voi kaapata VNC-istuntosi käyttöönsä ja myydä vaikka pikkupöksyjä nimissäsi ynnä muuta varsin ikävää. Jos VNC-työpöydällä sattuu olemaan rootin oikeuksin shelli auki.... kone on käytännössä mennyttä eli se joudutaan asentamaan alusta asti uudelleen, koska rootin oikeuksin murtautuja voi tehdä koneen tietoturvasta reikäisen kuin sveitsinjuuston, mm. avaamaan palvelun, jonka kautta hän pääsee jatkossa vaikeuksitta koneeseen rootiksi kenenkään huomaamatta, käyttämään konetta hyökkäyksiin FBI:tä tai jotain muuta Ikävää Isoa Firmaa vastaan. Laitetaan siis kapulia taas rattaisiin, pistetään työpöytä lukkoon.

Lukkoon työpöydän saa helposti: Gnomen tehtäväpalkissa on knappula, jossa munalukon kuva. Painallus siitä, niin muutaman sekunnin pohtimisen jälkeen kuva menee mustaksi. Hiiren liikautuksella esiin tulee ikkuna, jossa kysytään salasanaa. Linux-salasanallasi saat lukituksen auki. Käyntiin lähtee myös silmiä hivelevä näytönsäästäjä, joka VNC-yhteyden yli ei välttämättä kuitenkaan hivele silmiä. Gnomeen liitetyt näytänsäästäjät kun ovat varsinaisia grafiikkahirmuja ja pyörivät kunnolla vasta noin 2.7 THz:n Flentiumilla, jossa kiinni 1000x AAAGP eli Aivan Autuaaksitekevän Advanced Graphics Port joka siirtää vähintään miljuuna teratonnitavua sekunnissa. Raukkaparka VNC joutuu kaiken puskemaan 100 Mbps verkkokortin läpi eli frameja tippuu ns. sikana ja verkkokortti sekä koneen prosessori ovat tukkoon asti kuormitettuja. Näytönsäästäjäksi painokkaasti suosittelen ns. Blank Screen eli tyhjä ruutu -säästäjää. Määritellään se seuraavaksi. Käynnistä shellistä xscreensaver-demo (tai menusta Preferences -> Screensaver). Display Modes -välilehdellä on knappula Mode. Laita siihen Blank screen only.

Kohdasta Lock screen after voidaan laittaa työpöydän lukitus automaattiseksi ja suosittelen laittaa sen automaattiseksi. Jos Verkko vaikka kaatuu kesken VNC-käytön, VNC-työpöytä menee muutaman minuutin kuluessa automaattisesti lukkoon eikä jää auki vaikkapa yöksi. Kohtaan Blank screen after ajaksi vaikka 10 minuuttia, sitten Lock screen after -ruutuun rasti. ja ajaksi minuutti.



Tehokäyttäjä halunnee muuttaa VNC-serverin kokoa ja värimäärää. Oletuksena on 8-bittiset eli 256 väriä ja resoluutio 1024*768. Muutettavat kohdat löytyvät VNC-serverin käynnistysscriptistä /usr/bin/vncserver. Koska tuohon tiedostoon on kirjoitusoikeus vain rootilla, muutokset on joko tehtävä roottina tai sitten kopioitava scripti omaan kotihakemistoon. Roottina riehumisen välttämiseksi ehdotan, että kopioidaan scripti omaan kotihakemistoon. Vapaa shelli käyttöön, "cp /usr/bin/vncserver ." ja sitten editoimaan. "pico -w vncserver". Tiedoston aika alusta löytyy kiinnostavia kohteita. Noin rivi 30: $geometry = "1024x768", muuta siihen haluamasi resoluutio. Resoluutio ei ole millään tavalla sidottu näyttökorttien kykyihin. Tuohon voinee kirjoittaa vaikka 6000x4000, jos vain serverikoneesta löytyy tarvittava määrä muistia. 6000*4000 256 värillä tekisi 6000*4000*1 tavua eli noin 24 megatavua. Seuraava rivi taas sisältää värimäärän eli bittisyvyyden, depth. Oletusarvo 8, tilalle voi tarjota 16, jolloin värejä saa tutut 65536 tai 24, jolloin saa täydet värit. Huomaa, että värimäärän lisääminen syö muistia. Mässäilystä voi seurata serverikoneen hyytyminen. Tiedosto talteen CTRL-X:llä. VNC-serveri käyntiin komennolla ./vncserver . Muutokset eivät vaikuta käynnissä oleviin VNC-servereihin vaan muutosten jälkeen käynnistettäviin.

Red Hatin jäljiltä VNC-serveri näyttää olevan sillä mallilla, että siihen pääsee kiinni useammalla clientillä yhtaikaa eli kun värkkäät VNC:llä, jollakulla toisella voi olla, jos on saanut tietoonsa VNC-salasanasi tai onnistunut murtautumaan VNC-serveriin, VNC-työpöytäsi näkösällä ja lysti on tietenkin suurta kun saa seurata, mitä koneellasi puuhaat. Kun sitten jätät VNC-työpöydän hetkeksi koskemattomaksi, hän avaa shellin ja lähettää nimissäsi uutisryhmiin pikkupöksyjen myynti-ilmoituksen tai haukkuu pomosi. Tätähän toki emme halua. vncserver-skripti avaa VNC-serverin itse asiassa komentaen käyntiin ohjelman nimeltään Xvnc ja antaen sille parametrit. Xvnc osaa myös parametrin -nevershared, joka ohjaa Xvnc:n nitistämään wanhan vncviewerin pois, kun uusi yhteys otetaan. Lisätään -nevershared vncserverin käynnistykseen: pico -w vncserver, noin rivillä 140 ovat Xvnc:n parametrit, parametri per rivi. Rivit ovat mallia  $cmd .= " -rfbauth $vncUserDir/passwd"; . Lisätään mallin mukaisesti rivi
$cmd .= " -nevershared" . Seuraava käynnistettävä VNC-serveri huolii sitten vain yhden viewerin kerrallaan.



Sitten Next Step: Tunneloidaan VNC-yhteys SSH:n sisään. Tällä saadaan kaksi, kolmekin etua.

1. Yhteys ei ole tunnetuilla keinoilla helposti salakuunneltavissa; suojaustaso on sama kuin SSH:lla.
2. VNC-yhteys onnistuu läpi palomuurien, joissa auki on vain SSH-portti
3. SSH:n pakkaamisoptiolla saadaan VNC-yhteys mahdollisesti toimimaan nopeammin.
 



Entä jos VNCViewer pitäisi pyöriä Linuxissa ja SSH-tunnelointi olla päällä? Tässäkin otetaan SSH-yhteys etäkoneeseen. Tässä täytyy kaikki takoa komentoriville. Lähdetään tässä siitä, että serverikoneessa on VNC-serveri pyörimässä, sanotaan vaikka näytön numerolla :3 ja se halutaan viewer-koneeseen portiksi :1. Aletaan takoa:

ssh -L 5901:serveri.domain.fi:5903 -l <käyttäjätunnus> serveri.domain.fi

...ja normaalisti serverikoneeseen sisään. SSH-tunneli on nyt auki, jos homma meni putkeen. Selitykset: ssh on komento, -L sanoo että nyt tehdään port forward eli tunnelointi, 5901 on portti, jossa VNC-serverin halutaan viewer-koneessa näkyvän, serveri.domain.fi on server-koneen nimi tai IP-osoite, 5903 on VNC-serverin näytön numerosta johdettu portin numero, -l kertoo että seuraavaksi tulee käyttäjätunnus, <kayttajatunnus> on se käyttäjätunnus, serveri.domain.fi on toistamiseen VNC-serverikoneen nimi tai IP-osoite.

Sitten viewer-koneessa komento

vncviewer -encodings hextile localhost:1

... ja vnc-salasana. Jos kaikki meni putkeen, VNC-serverin näyttö aukeaa Linux-koneesi ruudulle. Tässä vncviewer on komento, -encodings hextile kertoo, että käytetään hextile-pakkausta. Pakkaus pitää kertoa, koska muuten VNCviewer sanoo, että "same machine: preferring RAW encoding" eli ei pakkaa VNC-dataa lainkaan, jolloin verkko valittaa ja käyttö on tahmaista. localhost:3 on koneen oma IP-osoite ja tunneloidun VNC-yhteyden portti, vrt. ylemmällä rivillä 5901:serveri...

Jos haluat SSH-kompressoinnin tähän päälle, se tehdään ssh-komennon yhteydessä: lisää vain lippu -C, siis ssh -C -L 5901:serveri.....



SSH-tunnelointi toki ottaa hieman konetehoa yhteyden kummassakin päässä. Jos koneet ovat hitaita mutta linkki nopea, SSH:n pakkausta ei kannata käyttää. Jos taas on toisinpäin, nopeat koneet ja hidas linkki malliin 256/256 SDSL, pakkauksesta voinee olla ihan kivastikin hyötyä.


N'Zoi!

-A

Sivua päivittänyt viimeksi Archy 21.2.2005