Cvičení: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14.

V tomto cvičení si rychle osvěžíme principy fungování sítě a asymetrickou kryptografii. Pak začneme používat SSH: způsob, jak pracovat v shellu na vzdáleném Linuxovém stroji. Také budeme trochu mluvit o přístupových právech na Linuxových strojích, protože jsou pro nás důležité při práci na sdílených počítačích.

Podíváme se i na základní síťové utility, které nám umožní číst konfiguraci sítě a ladit problémy s konektivitou.

Nezapomeňte, že Čtení před cvičením je povinné a je z něj kvíz, který musíte vyplnit před cvičením.

Tohle je čtení před sedmým cvičením.

Čtení před cvičením

Čtení před cvičením je rozděleno na čtyři velké části. Sítě, kterou můžete přeskočit, pokud už jste absolvovali nějaký předmět na toto téma a chápete, co je paket, IP adresa nebo TCP port. Unixová přístupová práva, která vysvětluje, kdo a kdy může přistupovat k souborům na Linuxu. Poté budeme pokračovat krátkým oživením asymetrické kryptografie, kterou už nejspíš taky znáte. A nakonec představíme SSH (bezpečný vzdálený shell).

Počítačové sítě

Tento text předpokládá, že už máte základní znalosti o sítích. Termíny jako IP adresa, rozhraní nebo port by pro vás neměly být nové. Potřebujete-li si je oživit, připravili jsme krátkou stránku se stručným přehledem sítí. Klidně ji přeskočte, nebo jen rychle proleťte.

Unixová přístupová práva

Zatím jsme jen tiše ignorovali fakt, že je na každém Linuxovém systému více uživatelských účtů. A také to, že uživatelé nemůžou přistupovat ke všem souborům. V této části vysvětlíme základy Unixových přístupových práv, a jak je interpretovat.

Vzpomeňme si, co jsme říkali o /etc/passwd – obsahuje seznam uživatelských účtů na tom konkrétním stroji (technicky to není jediný možný zdroj uživatelských záznamů, ale prozatím je to dobrá aproximace).

Každá běžící aplikace, tedy process, je vlastněná jedním z uživatelů z /etc/passwd (opět to tu trochu zjednodušujeme). Také říkáme, že tento proces běží pod konkrétním uživatelem.

A každý soubor v souborovém systému (včetně jak reálných souborů jako ~/.bashrc, tak virtuálních jako /dev/sda nebo /proc/uptime) má svého vlastníka.

Když se proces pokouší číst nebo upravovat soubor, operační systém rozhodne, jestli je tato operace oprávněná. Toto rozhodnutí je založené na vlastníkovi souboru, vlastníkovi procesu a právech definovaných pro daný soubor. Je-li operace zakázána, vstupní/výstupní funkce ve vašem programu vyvolá výjimku (např. v Pythonu) nebo vrátí chybový kód (v C).

Protože model založený pouze na vlastnících by nebyl dostatečně flexibilní, máme také skupiny uživatelů (definované v /etc/group). Každý uživatel je členem jedné nebo více skupin, z nichž jedné se říká primární skupina. Tyto skupiny jsou asociované s každým procesem daného uživatele. Soubory pak mají jak vlastnícího uživatele, tak vlastnící skupinu.

Soubory mají přiřazené tři množiny oprávnění: jednu pro vlastníka souboru, druhou pro uživatele ve vlastnící skupině a třetí pro všechny ostatní uživatele. Přesný algoritmus pro určení, která množina bude použita, vypadá takto:

  1. Je-li uživatel, který proces spustil, stejný jako vlastník souboru, jsou použita přístupová práva vlastníka (někdy také označované jako uživatelská přístupová práva).
  2. Je-li uživatel běžícího procesu ve skupině, která byla nastavena u souboru, jsou použita skupinová (group) přístupová práva.
  3. Jinak systém použije ostatní přístupová práva.

Každá množina oprávnění obsahuje tři práva: čtení (r), zápis (w), spouštění (execute, x):

  • Operace čtení a zápisu souboru se chovají očekávatelně.

  • Právo na spouštění se ověřuje v případě, kdy se uživatel snaží spustit soubor jako program (připomeňme, že bez chmod +x, se v takovém případě objevovala chyba Permission denied: zde je její důvod).

    • Poznamenejme, že skript, který lze číst, ale není spustitelný, můžeme stále spustit zavoláním příslušného interpretru manuálně.
    • Po spuštění programu nový proces zdědí vlastníka a skupiny svého rodiče (např. shellu, který jej spustil). Vlastnictví samotného spustitelného souboru není směrodatné po jeho spuštění. Například /usr/bin/mc vlastní uživatel root, ale přesto může být spuštěn libovolným uživatelem a běžící proces je poté vlastněný tím, kdo jej spustil.

Stejná oprávnění se vztahují také na adresáře, ale jejich význam je trochu odlišný:

  • Právo na čtení umožňuje uživateli číst seznam souborů uvnitř (běžných, symlinků, podadresářů, atd.).
  • Právo na zápis uživateli umožňuje vytvářet, odstraňovat a přejmenovávat soubory uvnitř. Všimněte si, že odstranění práva na zápis k souboru uvnitř zapisovatelného adresáře, je bezvýznamné, protože to uživateli nezabrání v tom, aby soubor nahradil úplně novým.
  • Spustitelné (executable) právo na adresáři umožňuje uživateli otevírat položky uvnitř. (Má-li adresář x, ale ne r, můžeme používat soubory uvnitř, pokud známe jejich názvy, nemůžeme ale vypsat jejich seznam. Na druhou stranu, má-li adresář r, ale ne x, můžeme vypsat seznam souborů, ale nemůžeme je použít.)

Oprávnění souboru nebo adresáře může měnit pouze jejich vlastník a to bez ohledu na aktuální oprávnění. To znamená, že vlastník může sám sobě odepřít přístup odstraněním všech přístupových práv, ale stejně jej poté může později obnovit.

Uživatelský účet root

Vedle účtů pro normální uživatele je zde vždy i účet pro takzvaného superuživatele – obvykle nazývaného jen root – ten má administrátorská práva a je tedy oprávněn dělat cokoliv s libovolným souborem v systému. Ověřování oprávnění popsané výše jednoduše vůbec neplatí pro procesy vlastněné rootem.

Na rozdíl od jiných systémů, Linux je navržený tak, aby uživatelské programy byly vždy spouštěny pod normálními uživateli a nikdy nevyžadovaly práva roota. Ve skutečnosti se některé programy i odmítnou spustit pod uživatelem root (historicky jde o velmi časté chování IRC chatovacích programů).

Zobrazování a změna oprávnění

Podíváme-li se na zkratky rwx pro jednotlivá oprávnění, možná vám budou povědomá:

drwxr-xr-x 1 intro intro 48 Feb 23 16:00 02/
drwxr-xr-x 1 intro intro 60 Feb 23 16:00 03/
-rw-r--r-- 1 intro intro 51 Feb 23 16:00 README.md

První sloupec obsahuje typ položky (d pro adresář, - pro obyčejný soubor, atd.) a tři trojice oprávnění. První trojice se vztahuje k vlastníkovi souboru, prostřední ke skupině a poslední ke zbytku světa (k ostatním). Třetí a čtvrtý sloupec obsahují vlastníka a skupinu souboru.

Vaše osobní soubory v $HOME budou typicky mít za vlastníka vás spolu se skupinou stejného jména. Jde o výchozí konfiguraci, která brání ostatním uživatelům, aby viděli vaše soubory.

Poznamenejme, že většina souborů je ve skutečnosti přístupná ke čtení všem.

To je v pořádku, protože když se podíváte na oprávnění pro svůj $HOME, uvidíte, že je to typicky drwx------. Jen vlastník jej může upravovat a provést cd dovnitř. Vzhledem k tomu, že nikdo nemůže změnit svůj pracovní adresář na vaši domovskou složku, nikdo nemůže ani číst vaše soubory (technicky, čtení souboru znamená projít celou adresářovou strukturu a ověřit přístupová práva na celé této cestě).

Na změnu oprávnění můžete použít program chmod. Ten má obecně formát

chmod WHO[+=-]PERMISSION file1 file2 ...

WHO může být prázdné (pro všechny – uživatele, skupinu a ostatní) nebo některé z u, g a o. A PERMISSION může být r, w nebo x.

Sticky a jiné bity

Když spustíte následující příkaz, uvidíte trochu jiný výstup, než byste nejspíš očekávali.

ls -ld /usr/bin/passwd /tmp
drwxrwxrwt 23 root root   640 Mar  3 08:15 /tmp/
-rwsr-xr-x  1 root root 51464 Jan 27 14:47 /usr/bin/passwd*

Můžete si všimnout, že /tmpt na místě executable bitu a passwd tam má s.

Jde o speciální varianty executable bitu. Bit t u adresáře znamená, že uživatel může odstranit jen své vlastní soubory. Důvod je jednoduchý – neměli byste mít možnost odstraňovat cizí soubory uvnitř /tmp. S použitím jen základních oprávnění by toto nebylo možné.

Bit s (sticky) je trochu trikovější. Ten specifikuje, že bez ohledu na to, kdo spustil shell, passwd se vždy spustí pod uživatelem vlastnícím tento soubor (což je zde root).

Přestože to může vypadat neužitečně, jde o jednoduchý způsob, jak umožnit spouštění některých programů s vyššími oprávněními. passwd je typický příklad. Tento příkaz umožňuje uživateli změnit jeho heslo. To je ale uložené v souboru, který není přístupný ani ke čtení nikomu kromě roota (z očividných důvodů). Přiřazení bitu s ke spustitelnému souboru znamená, že proces poběží pod rootem a bude tak moci upravovat databázi s uživateli (tedy /etc/passwd a /etc/shadow, který obsahuje vlastní hesla).

Vzhledem k tomu, že změnu oprávnění může provést pouze vlastník souboru, není zde nebezpečí, že by podlý uživatel přidal bit s k jiným spustitelným souborů.

Jsou zde ještě drobné odlišnosti vztahující se k Unixovým oprávněním a jejich nastavování, viz chmod(1) pro podrobnosti.

Nád rámcem tradičních Unixových oprávnění: POSIX ACL

Model oprávnění popsaný výše je vzácným příkladem konceptu pocházejícího z Unixu, který je považovaný za málo flexibilní pro dnešní použití. Přesto je také považován za typický příklad jednoduchého ale dobře použitelného bezpečnostního modelu.

Mnoho programů tento model okopírovalo a můžeme si jej tak všímat i na jiných místech. Jde tak určitě o něco, co je dobré si zapamatovat a pochopit.

Malá flexibilita systému spočívá v tom, že povolení přístupu k souboru konkrétní skupině lidí vyžaduje vytvoření speciální skupiny pro tyto uživatele. Skupiny jsou přitom definovány v /etc/group, což vyžaduje administrátorská práva.

S rostoucím počtem uživatelů nám také může exponenciálně růst potřebný počet skupin. Na druhou stranu pro většinu situací stačí základní Unixová oprávnění.

Abychom se vypořádali s tímto problémem, Linux poskytuje také tzv. POSIX access control lists, díky čemuž lze přiřadit libovolný seznam uživatelů k libovolnému souboru pro specifikování jejich oprávnění.

Budeme vyžadovat, abyste věděli, že getfacl a setfacl slouží k ovládání těchto oprávnění, ale protože jsou v praxi potřeba zřídka, necháme jejich znalost na případně přečtení příslušných manuálových stránek.

O asymetrické kryptografii

Dříve než se ponoříme do detailů k SSH, potřebujeme si stručně oživit některá témata související s kryptografií.

V tomto cvičení se budeme bavit hodně o asymetrické kryptografii. Obecně je to metoda šifrování/dešifrování, u níž potřebujeme jiný klíč pro dešifrování zprávy, než byl použit pro její zašifrování.

V tom je rozdíl oproti symetrickým šifrám. Např. známá Caesarova šifra má jen jeden klíč (posun v abecedě), který je použit pro šifrování i dešifrování.

Typické použití asymetrické kryptografie zahrnuje označení jednoho klíče za veřejný a druhého za soukromý. Například když zveřejníte šifrovací klíč a dešifrovací necháte tajný, může vám každý poslat šifrovanou zprávu, ale jen vy ji můžete dešifrovat. To je považováno za bezpečné, pokud je nemožné (nebo aspoň dostatečně obtížné) odvodit soukromý klíč z veřejného.

Má to jednu jasnou výhodu: nepotřebujete vytvářet tajný symetrický klíč pro každou dvojici uživatelů, kteří spolu chtějí komunikovat. Místo toho každý rozdistribuuje svůj veřejný klíč a hlídá si jen jeden privátní. (Není to ale tak jednoduché, jak to vypadá: Když Alice chce poslat šifrovanou zprávu Bobovi, musí se ujistit, že daný veřejný klíč opravdu patří Bobovi. Jinak by mohla snadno vytvořit bezpečné spojení, ale k útočníkovi.)

Naneštěstí nemáme žádný dobrý příklad asymetrické šifry tak jednoduchý jako byla Caesarova. Jako trochu složitější ale stále srozumitelný příklad se můžete podívat na RSA.

Poznamenejme, že výběr dobré šifry je jen malý krok v bezpečné komunikaci. Chcete-li se dozvědět více, zkuste nějakou opravdovou učebnici kryptografie, nebo se přihlaste na některý z našich kryptografických předmětů.

Dvojí použití asymetrické kryptografie

Asymetrická kryptografie má dvě hlavní použití. První je jasné: známe-li veřejný klíč příjemce zprávy, můžeme jej použít pro její zašifrování a poslat ji nezabezpečeným kanálem (beze strachu, že by ji někdo jiný mohl přečíst).

Ale můžeme to použít také naopak k autentizaci vlastníka soukromého klíče. Předpokládejme zde, že umíme distribuovat veřejný klíč bezpečně.

Mini-protokol poté dokáže autentizovat (ověřit), že protistrana je tím, za koho se vydává, prokázáním vlastnictví soukromého klíče (předpokládáme tedy, že soukromé klíče nebyly ukradeny).

Metoda je velmi jednoduchá – odesílatel vygeneruje náhodný text a zašifruje jej veřejným klíčem příjemce (kterého chceme ověřit). Je-li příjemce skutečný vlastník, dokáže náhodný text dešifrovat a poslat zpět. Nemožnost text dešifrovat znamená, že příjemce není vlastníkem soukromého klíče.

Autentizace veřejným a soukromým klíčem

Obvykle se uživatelé autentizují ke službě pomocí přihlašovacího jména a hesla. Přestože je tento způsob přirozený a pro lidi obvyklý, má několik nevýhod.

Hlavním problémem je složitost hesla: lidé zřídkakdy mají silná hesla a jen málo lidí používá správce hesel. Používání stejných hesel na více místech zase dovoluje administrátorovi (nebo hackerovi) jedné ze služeb se za vás vydávat v těch ostatních.

Namísto toho některé služby umožňují se autentizovat pomocí veřejného klíče. Uživatel nahraje svůj veřejný klíč na server (s použitím přihlašovacího jména a hesla, pro ověření této operace), a když se poté chce přihlásit, server mu pošle náhodná data zašifrovaná jeho veřejným klíčem. Protože jde o výhradního vlastníka privátního klíče (a tedy jediného, kdo je schopný dešifrovat), může zprávu dešifrovat a potvrdit tím svou identitu. Operace pak pokračuje jako s jinak autentizovaným uživatelem.

Užitečná pravidla

Aby autentizace veřejným klíčem probíhala bezpečně, následující je velmi doporučené (většina těchto pravidel platí i pro jiné způsoby přihlašování).

Soukromý klíč je jako heslo – nesmí uniknout. Obvykle jde o soubor a ten je tedy potřeba chránit. Typickou volbou pro přenosná zařízení je mít šifrovaný pevný disk.

Je také možné chránit heslem přímo klíč. Ani v případě uniklého souboru s privátním klíčem pak nehrozí okamžitě krádež identity. Poznamenejme, že jsou zde nástroje, jako například ssh-agent(1), které umí uložit heslo na krátkou dobu, takže jej nemusíte zadávat při každém použití klíče.

Máte-li více počítačů, je preferováno používat různé páry veřejného a soukromého klíče na každém z nich. Je-li jeden stroj kompromitován, stačí odebrat jeho veřejný klíč ze všech aplikací, zatímco stále můžete používat ostatní klíče.

SSH

SSH – zkratka pro Secure Shell – je protokol pro připojení k jiným počítačům a používání shellu na nich.

Z uživatelské perspektivy poté, co se připojíte z Linuxového stroje na jiný Linuxový stroj, shell může vypadat stejně a některé příkazy se můžou chovat úplně stejně. Jen s tou výjimkou, že budou spuštěny na jiném počítači.

Jde o záměrné chování: vzdálený (a bezpečný) shell je přirozený způsob pro ovládání Linuxového stroje. Není potřeba jej odlišovat od lokálního shellu.

Git přes SSH

Dosud jsme používali Git před HTTPS. Git ale můžeme používat také přes SSH. Komunikace je pak jednoduše tunelovaná skrz SSH spojení, na kterém Git závisí jak kvůli bezpečnosti tak (částečně) kvůli autentizaci.

V podstatě všechny Gitové servery (GitLab, GitHub, Bitbucket, …) po vás budou chtít nahrát váš veřejný klíč, abyste mohli používat Git přes SSH.

My to uděláme během cvičení. Prozatím si jen připomeňte text výše pro pochopení principu, proč je GitLab schopný vás autentizovat pomocí veřejného klíče (tj. s veřejným klíčem není potřeba zadávat vaše uživatelské jméno).

Kvíz před cvičením

Soubor s kvízem je ve složce 07 v tomto GitLabím projektu.

Zkopírujte si správnou jazykovou mutaci do vašeho projektu jako 07/before.md (tj. budete muset soubor přejmenovat).

Otázky i prostor pro odpovědi jsou v souboru, odpovědi vyplňte mezi značky **[A1]** a **[/A1]**.

Pipeline before-07 na GitLabu zkontroluje, že jste odevzdali odpovědi ve správném formátu. Ze zřejmých důvodů nemůže zkontrolovat skutečnou správnost.

Odevzdejte kvízy před začátkem sedmého cvičení.

Using SSH

Using SSH is very simple (unless you make it complex). To SSH to a remote machine, you need to know your credentials (i.e., login name and a password) and, of course, the name of the remote machine.

Then simply execute the following:

ssh YOUR_LOGIN@REMOTE_MACHINE_NAME

Note that the command ssh is often called a SSH client as it connects to the SSH server (similar to curl or wget being web clients connecting to a web server).

We have set up a remote machine for you on linux.ms.mff.cuni.cz. You will be using your GitLab (SIS/CAS) login and also the same password.

ssh YOUR_SIS_LOGIN@linux.ms.mff.cuni.cz

The first login to the machine is a bit more complicated. SSH client wants from you a verification that you trust the remote server. It shows you a so-called server fingerprint:

The authenticity of host 'linux.ms.mff.cuni.cz (195.113.20.170)' can't be established.
ECDSA key fingerprint is SHA256:ltoc1TjoYhCZk6b8qSTAL6wFsRv7blw6u3h6NqCcYvI.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Based on your configuration, RSA or ED25519 key may be used instead:

RSA: SHA256:Z11Qbd6nN6mVmCSY57Y6WmxIJzqEFHFm47ZGiH4QQ9Y
ED25519: SHA256:/CVwDW388z6Z5VlhLJT0JX+o1UzakyQ+S01+34BI0BA

You should have received this fingerprint in a secure way before connecting to the server (for example, printed from your employer etc.). In this case, we hope that a potential attacker would not be able to break both into this web server and the SSH server at once. So we use the HTTPS protocol on the web as a secure way of verifying the SSH server.

The program then continues to ask your for a password and also informs you that the fingerprint was stored.

On following logins, the SSH client checks that the fingerprint has not changed. A changed fingerprint belonging to the same machine (i.e., with the same DNS name) could indicate a man-in-the-middle attack. Do not connect when the fingerprint has changed. Always contact the administrator (e.g., the teachers in this particular case) and check with him what is happening.

If you were able to log-in, you will see an (almost) empty $HOME and otherwise a normal Linux machine, this time without any graphical applications installed.

Note that this machine is shared for all students of this course. Use it to solve graded tasks or to experiment with commands we show in the labs. Do not use it for computationally intensive tasks or other tasks that are not related to this course. If we encounter any form of abusive use, we will block the offending account.

Using machines in Rotunda

Apart from the machine linux.ms.mff.cuni.cz, there is also a full lab of machines available in the Rotunda computer lab on Malostranské náměstí.

All the Linux machines in the lab are also reachable via SSH. Again, use your SIS credentials to log in. Note that all machines in Rotunda (but not linux.ms.mff.cuni.cz!) share the same $HOME, i.e., it does not matter which one you physically connect to. Your files will be available on all machines.

Unfortunately, the used file system and authentication mechanism does not allow to use public key authentication for Rotunda machines. You need to always specify your password. (linux.ms.mff.cuni.cz does not have this limitation and we expect you will use public key authentication there.)

Following machines are available.

  • Lab SU1
    • u1-1.ms.mff.cuni.cz
    • u1-2.ms.mff.cuni.cz
    • u1-14.ms.mff.cuni.cz
  • Lab SU2
    • u2-1.ms.mff.cuni.cz
    • u2-2.ms.mff.cuni.cz
    • u2-25.ms.mff.cuni.cz
  • Rotunda
    • u-pl1.ms.mff.cuni.cz
    • u-pl2.ms.mff.cuni.cz
    • u-pl23.ms.mff.cuni.cz

Using SSH to run one command

The command ssh is actually quite powerful and configurable. One important feature is that you can specify a command after the hostname and run this command directly. In this case, SSH never starts an interactive shell on the remote machine, but executes only the given command and returns.

Following commands prints uname -r on the remote machine.

ssh user@hostname uname -r

Investigate how (and why) the following command behaves differently.

ssh user@hostname uname -r >local_file.txt
ssh user@hostname "uname -r >remote_file.txt"

To verify that you are on a different machine, run on both uname -a and hostname -f (it provides the full DNS name of the current machine).

Can you see the differences?

You can also trying checking free -h or uptime.

SSH and passwordless authentication

To enable authentication with public key over SSH, we need to perform two steps. Generate the public-private key pair and copy the public key to the remote machine.

To generate the public key we need to run the following command (the -C is actually a comment, providing e-mail or your login is the usual approach but keeping it empty is possible too).

ssh-keygen -t ed25519 -C "your_email@example.com"

The program would ask us where to store the generated private and public key. Keep the defaults. Choose if you want a passphrase or not (it is more secure to have one, but the use is a bit more cumbersome). After ssh-keygen finishes, check that the directory ~/.ssh contains id_ed25519 (the private key) and id_ed25519.pub (the public key).

Feel free to inspect their content. Surprised that they are text files?

Once we have the public key ready, we need to upload it to the remote machine. If you have multiple key pairs, read about the -i switch.

ssh-copy-id LOGIN@REMOTE_MACHINE

If you log in to the remote machine again, the SSH client should use the key pair and log you in without asking for a password. If not, run SSH with -vvv to debug the issue.

Note that the public key was stored into ~/.ssh/authorized_keys file on the remote machine. You can copy it there manually but using ssh-copy-id is easier.

Update if the copying fails with cryptic message about warning: here-document at line 251 delimited by end-of-file (wanted EOF), try upgrading the SSH client first. If you use the image from us, simple sudo dnf upgrade openssh-clients should work.

Disabling login/password

Note that some services actually require that you authenticate using a key-pair instead of a password as it is considered more secure.

The advantage is that any random attackers could keep guessing your password and still never get access to your machine.

Typically, the server is also configured to ban any client that tries to login without success several times in a row. Our server does that, too.

SSH configuration

The SSH client is configured via the ~/.ssh/config file. Review the syntax of this file via man 5 ssh_config.

The file is divided into sections. Each section is related to one or more remote hosts. The section header is in the format Host pattern, where pattern might use wildcards.

The syntax is mostly self-explanatory, so we will only provide an example.

Host *
    IdentityFile ~/.ssh/id_ed25519

Host intro
    Hostname linux.ms.mff.cuni.cz
    User YOUR_SIS_LOGIN

Host mff1
    Hostname u-pl6.ms.mff.cuni.cz
    User YOUR_SIS_LOGIN

Host mff2
    Hostname u-pl17.ms.mff.cuni.cz
    User YOUR_SIS_LOGIN

With this ~/.ssh/config, we can type ssh intro and the ssh will start connection equivalent to

ssh YOUR_SIS-LOGIN@linux.ms.mff.cuni.cz

We recommend to use different u-pl* hostnames in your config to distribute the load across multiple machines. Note that the Rotunda machines may be unevenly loaded, so it is a good idea to bookmark several of them and re-login if the first one is too slow.

Copying files

SCP

In order to copy files between two Linux machines, we can use scp. Internally, it establishes a SSH connection and copies the files over it.

The syntax is very simple and follows the semantics of a plain cp:

scp local_source_file.txt user@remote_machine:remote_destination_file.txt
scp user@remote_machine:remote_source_file.txt local_destination_file.txt

SCP issues

For those who care about security we should note that that the SCP protocol has some security vulnerabilities. These can be used to attack your “local” computer while connecting to a malicious server.

SCP is actually a very old protocol, which is showing its age. Better replacements include SFTP (beware that this is different from FTPS – FTP over SSL/TLS) and Rsync.

More information on this topic can be found on LWN.net.

Rsync

A much more powerful tool for copying of files is rsync. Similarly to scp, it runs over a SSH connection, but it has to be installed at both sides. It can copy whole directory trees, handle symlinks, access rights, and other file attributes. It can also detect that some of the files are already present at the other side (either exactly or approximately) and transfer just the differences.

The syntax of a simple copy follows cp and scp, too:

rsync local_source_file.txt user@remote_machine:remote_destination_file.txt
rsync local_source_file.txt user@remote_machine:remote_destination_directory/

File managers

Many file managers allows you to open a SCP-style connection transparently and copy between machines with the same ease as when working with local files.

For example, in mc, select Shell connection either in left or right panel and specify SSH connection. One of the panels will show the files on the remote machine. Try using F5 to copy files interactively.

Git přes SSH

To actually use Git over SSH, we first need to tell GitLab about our SSH keys (recall the protocol that is used to authenticate the user).

GitLab and SSH keys

Copy your public key to GitLab. Navigate to right-top menu with your avatar, select Preferences and then SSH keys or visit this link.

Copy your public key there and name it. Typically, the name should mention your username and your machine. Note that GitLab will send you an e-mail informing you about a new key. Why? Hint. Answer.

Go to your project and clone it again. This time, use the Clone with SSH URL.

git clone git@gitlab.mff.cuni.cz:teaching/nswi177/2022/student-LOGIN.git

Have you noticed that this looks like SSH/SCP address? It actually is exactly that. The first part identifies the machine and the user (git) and after a colon is a local path.

You can clone this way a Git directory from any SSH server by specifying its remote path there (here, GitLab does some mangling but the principle holds).

Note that the user we clone with is git – not you. This way, GitLab needs only one physical user account for handling Git requests and distinguishes the users via their public keys. How? Answer.

By the way, what happens if you try to run the following?

ssh git@gitlab.mff.cuni.cz

Note that you should use the SSH protocol for working with Git as it is much more comfortable for use. Note that Git on other platforms also offers generation of an SSH key but often the key is usable only by one application (different applications have incompatible key formats), while on Linux a single key is a generally usable for Git, other machines, and other services.

More about access rights

Let’s return a little bit to the access rights.

Change permission of some of your scripts to be --x. Try to execute them. What happens? Answer.

Remove writable bit for a file and write to it using stdout redirection. What happens?

Reading network configuration

For the following text we will assume your machine is connected to the Internet (this includes your virtualized installation of Linux).

The basic command for setting and reading network configuration is ip.

Probably the most useful one is ip addr.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 54:e1:ad:9f:db:36 brd ff:ff:ff:ff:ff:ff
3: wlp58s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 44:03:2c:7f:0f:76 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.105/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp58s0
       valid_lft 6209sec preferred_lft 6209sec
    inet6 fe80::9ba5:fc4b:96e1:f281/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
8: vboxnet0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff

It lists four interfaces (lo, enp0s31f6, wlp58s0 and vboxnet0) that are available on the machine. Your list will differ as well as the naming.

The name signifies interface type.

  • lo is the loopback device that will be always present. With loopback device, you can test network applications even without having a “real” connectivity.
  • enp0s31f6 (often also eth*) is a wired ethernet.
  • wlp58s0 is a wireless adapter.
  • vboxnet0 is a virtual network card used by VirtualBox when you create a virtual subnet for your virtual machines (you will probably not have this one there).

The state of the interface (up and running or not) is at the same line as the adapter name.

The link/ denotes the MAC address of the adapter. Lines with inet specify the IP address assigned to this interface, including the network. In this example, lo has 127.0.0.1/8 (obviously), enp0s31f6 is without an address (state DOWN) and wlp58s0 has address 192.168.0.105/24 (i.e., 192.168.0.105 with netmask 255.255.255.0).

Your addresses will be slightly different, but typically you will see also a private address (behind a NAT), as you are probably connecting through a router to your ISP.

Basic networking utilities

We will not substitute the networking courses here, but we mention two most important and useful commands that could help you debug basic network-related problems.

ping (a.k.a. are you there?)

The ping command is the basic tool to determine whether a machine with a given IP address is up (and responding to a network traffic).

The usage is extremely simple: you tell it the DNS name (or IP address) of the machine you wish to connect to and it starts sending packets. Typically, the session looks like this:

ping d3s.mff.cuni.cz
PING d3s.mff.cuni.cz (195.113.20.60) 56(84) bytes of data.
64 bytes from d3s.mff.cuni.cz (195.113.20.60): icmp_seq=1 ttl=50 time=16.8 ms
64 bytes from d3s.mff.cuni.cz (195.113.20.60): icmp_seq=2 ttl=50 time=14.9 ms
64 bytes from d3s.mff.cuni.cz (195.113.20.60): icmp_seq=3 ttl=50 time=15.0 ms
64 bytes from d3s.mff.cuni.cz (195.113.20.60): icmp_seq=4 ttl=50 time=36.1 ms
64 bytes from d3s.mff.cuni.cz (195.113.20.60): icmp_seq=5 ttl=50 time=14.3 ms
64 bytes from d3s.mff.cuni.cz (195.113.20.60): icmp_seq=6 ttl=50 time=15.0 ms
^C
--- d3s.mff.cuni.cz ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5271ms
rtt min/avg/max/mdev = 14.328/18.688/36.068/7.809 ms

By default, ping will send the ICMP packet forever, you can terminate it with Ctrl-C.

If the machine is not reachable (that might mean a problem anywhere on the route or on the destination machine itself), you will get behavior like in the following examples.

ping: connect: Network is unreachable
PING 195.113.20.60 (195.113.20.60) 56(84) bytes of data.
From 192.168.88.1 icmp_seq=1 Destination Net Prohibited
From 192.168.88.1 icmp_seq=2 Destination Net Prohibited
From 192.168.88.1 icmp_seq=3 Destination Net Prohibited
From 192.168.88.1 icmp_seq=4 Destination Net Prohibited
^C
--- 195.113.20.60 ping statistics ---
5 packets transmitted, 0 received, +4 errors, 100% packet loss, time 4042ms
pipe 3

ping is the basic tool if you suddenly lose a connection to some server. Ping the destination server and also some other well-known server. If the packets are going through, you know that the problem is on a different layer. If only packets to the well-known server gets through, the problem is probably with the server in question. If both fail, your network is probably down.

traceroute (a.k.a. the path is the goal)

Sometimes, it can be handy to know the precise path, which the packets travel. For this kind of task, we can use traceroute.

Similarly to ping, we need to just specify the destination.

traceroute 1.1.1.1
traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
 1  _gateway (10.16.2.1)  2.043 ms  1.975 ms  1.948 ms
 2  10.17.0.1 (10.17.0.1)  1.956 ms  1.971 ms  1.961 ms
 3  gw.sh.cvut.cz (147.32.30.1)  1.947 ms  1.973 ms  1.977 ms
 4  r1sh-sush.net.cvut.cz (147.32.252.238)  2.087 ms  2.262 ms  2.527 ms
 5  r1kn-konv.net.cvut.cz (147.32.252.65)  1.856 ms  1.849 ms  1.847 ms
 6  kn-de.net.cvut.cz (147.32.252.57)  1.840 ms  1.029 ms  0.983 ms
 7  195.113.144.172 (195.113.144.172)  1.894 ms  1.900 ms  1.885 ms
 8  195.113.235.99 (195.113.235.99)  4.793 ms  4.748 ms  4.723 ms
 9  nix4.cloudflare.com (91.210.16.171)  2.264 ms  2.807 ms  2.814 ms
10  one.one.one.one (1.1.1.1)  1.883 ms  1.800 ms  1.834 ms

The first column corresponds to the hop count. The second column represents the address of that hop and after that, you see three space-separated times in milliseconds. traceroute command sends three packets to the hop and each of the time refers to the time taken by the packet to reach the hop. So from the foregoing output we can see that the packages visited 10 hops on its way between the local computer and the destination.

This tool is especial useful, when you have network troubles and you are not sure where the issue is.

traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
 1  10.21.20.2 (10.21.20.2)  0.798 ms  0.588 ms  0.699 ms
 2  10.21.5.1 (10.21.5.1)  0.593 ms  0.506 ms  0.611 ms
 3  192.168.88.1 (192.168.88.1)  0.742 ms  0.637 ms  0.534 ms
 4  10.180.2.113 (10.180.2.113)  1.696 ms  4.106 ms  1.483 ms
 5  46.29.224.17 (46.29.224.17)  14.343 ms  13.749 ms  13.806 ms
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

From this log we can see that the last visited hop was 46.29.224.17, so we can focus our attention to this network element.

Going further: using tmux for better SSH experience

tmux is a terminal multiplexer. That means that inside one terminal it opens several terminals for you that are running in parallel. It also allows you to send the session into background so that it remains there even if you log out or your remote connection is interrupted (this is useful for running long scripts). In other words, tmux gives you tabs (called windows) inside your existing session that can be minimized/iconified (if borrowing terms from GUI would explain the usefulness better).

The simplest way how to start tmux session is simply:

tmux

Alternatively, we can start session with some meaningful name:

tmux new -s <session_name>

To list all sessions run:

tmux ls

To connect/attach to the running session run:

tmux attach -t <session_name>

And finally, in order to kill the session we use:

tmux kill-session -t <session_name>

Inside the session we are able to create multiple windows, split the screen and much more. In order to invoke a tmux command, we need firstly to type tmux prefix. The default key binding is C-b.

In order to detach from session we can simply press (do not forget to type the prefix!):

d  detach from session

Operation with windows:

c  create window
w  list windows
n  next window
p  previous window
f  find window
,  name window
&  kill window

Sometimes it is useful to split the screen into several terminals. These splits are called panes.

Operation with panes (splits):

%  vertical split
"  horizontal split

o  swap panes
q  show pane numbers
x  kill pane
←  switch to left pane
→  switch to right pane
↑  switch to upward pane
↓  switch to downward pane

Other feature is that you can toggle writing simultaneously to all panes. Performing the same operation multiple times may seem not much useful, but you can for example open several different ssh connections in advance and then interactively control all these computers at the same time.

To toggle it, type the prefix and then write :set synchronize-panes. If you want to try this in Rotunda, please do not run computationally intensive tasks…

As usual with Linux tools, you can modify its behavior widely via rc configuration. For instance, in order to navigate among the panes with vim shortcuts, modify your .tmux.conf so it contains

bind-key C-h run "tmux select-pane -L"
bind-key C-j run "tmux select-pane -D"
bind-key C-k run "tmux select-pane -U"
bind-key C-l run "tmux select-pane -R"

Personal tip № 0: tmux is an excellent tools for collaboration, as multiple users can attach to the same session.

Personal tip № 1: when you give a lecture, you can attach to the tmux session from two terminals. Later on, you push the first one to the projector, while the second one is on you laptop screen. This eliminates the necessity of mirroring your screen. Together with pdfpc and a tiling window manager we get a Swiss-army knife for presentation.

There is much more to say. For more details see this tmux cheatsheet or manual pages.

Hodnocené úlohy (deadline: 10. dubna)

Vzdálený soubor ~/LAB07 (25 bodů)

Vytvořte běžný soubor LAB07 ve svém domovském adresáři na linux.ms.mff.cuni.cz. Jako jeho jediný obsah použijte své UKČO (číslo ze svého ISICu).

Nevytvářejte tento soubor v GitLabu, budeme jej ověřovat jen na linux.ms.mff.cuni.cz.

Nahrání našeho klíče (25 bodů)

Přidejte následující veřejný klíč mezi autorizované klíče u svého účtu na linux.ms.mff.cuni.cz. Splnění úlohy ověříme tak, že se připojíme přes SSH na linux.ms.mff.cuni.cz pod vaším uživatelským jménem a tímto klíčem.

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPuoJJldIS6zOxunFxIFGk6tQlw0qpYSOxHYs57117o/ teachers-nswi177@d3s.mff.cuni.cz

Nevytvářejte tento soubor v GitLabu, budeme jej ověřovat jen na linux.ms.mff.cuni.cz.

07/key.pub (25 bodů)

Uložte svůj veřejný klíč do tohoto souboru.

Neztraťte přístup k jeho soukromé části – budete ji potřebovat pro některé pozdější úlohy.

07/file.txt (25 bodů)

Spusťte příkaz nswi177-lab07 na linux.ms.mff.cuni.cz.

Vložte jeho výstup do tohoto souboru.

Učební výstupy

Znalosti konceptů

Znalost konceptů znamená, že rozumíte významu a kontextu daného tématu a jste schopni témata zasadit do většího rámce. Takže, jste schopni …

  • vysvětlit základní principy síťové komunikace (bez ohledu na OS/zařízení)

  • vysvětlit principy asymetrické kryptografie

  • vysvětlit, jak se dá použít asymetrická kryptografie pro autentizaci uživatele

  • vysvětlit výhody použití Gitu přes SSH (namísto HTTPS)

  • vysvětlit, jaká jsou základní přístupová práva na Unixu a co znamená rwx pro běžné soubory a pro adresáře

  • vysvětlit sticky bit

  • vysvětlit rozdíl mezi vlastnictvím souboru (skriptu) a běžícího programu

  • vysvětlit, co je POSIX ACL, jen základní přehled (volitelné)

Praktické dovednosti

Praktické dovednosti se obvykle týkají použití daných programů pro vyřešení různých úloh. Takže, dokážete …

  • použít SSH na přihlášení se ke vzdálenému stroji

  • spouštět příkazy na vzdáleném stroji

  • používat příkazy uname a hostname

  • nastavit SSH zkratky (volitelné)

  • použít SCP na kopírování souborů mezi místním a vzdáleným počítačem

  • nastavit přihlašování bez hesla na vzdáleném Linuxovém stroji

  • nastavit autentizaci veřejným klíčem na GitLabu

  • používat Git přes SSH

  • zobrazovat a měnit unixová oprávnění

  • používat ip na dotazování aktuální síťové konfigurace (jejího stavu)

  • používat utility ping a traceroute

  • používat tmux (volitelné)

  • používat rsync (volitelné)