Tűzfal (firewall)

A Linux gépeken már régi téma a tűzfal. A tűzfal arra való, hogy védelmet nyújtson a magánhálózatoknak illetve a számítógépeknek az Interneten garázdálkodó rosszakaratú támadók ellen. Éppen ezért beszélhetünk hálózat-biztonságról – erről nálam itthon a router-en lévő tűzfal gondoskodik -, illetve hoszt-biztonságról, ami a Linux notebookom-on van telepítve. Ma már általában egyszerűek a beállítások, mind hálózati, mind hoszt szinten. Debian 10 alatt már automatikus az alap tűzfal-konfiguráció.

Régebben az ipchains volt, ma már az ún. iptables van használatban. Nézzük meg a Linux-unkat!

root@gergo1:~# iptables -L -v
Chain INPUT (policy DROP 590 packets, 93015 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
256 20230 ACCEPT all -- lo any anywhere anywhere
6008 2038K ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any 192.168.0.0/24 anywhere state NEW tcp dpt:netbios-ns
0 0 ACCEPT tcp -- any any 192.168.0.0/24 anywhere state NEW tcp dpt:netbios-dgm
0 0 ACCEPT tcp -- any any 192.168.0.0/24 anywhere state NEW tcp dpt:netbios-ssn
0 0 ACCEPT tcp -- any any 192.168.0.0/24 anywhere state NEW tcp dpt:microsoft-ds
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
6 336 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 6272 packets, 1041K bytes)
pkts bytes target prot opt in out source destination
256 20230 ACCEPT all -- any lo anywhere anywhere

Látható, hogy a bemeneten (INPUT) az SSH szerver, a Samba szerver (Microsoft hálózathoz) és a HTTP szerver van engedélyezve + az ICMP ping (leírása később), továbbá természetesen a már létrejött kapcsolatok is. Forward szinten semmi sincs “átengedve”. Nem továbbítunk adatot hálózatok között. Kimeneten (OUTPUT) pedig mindent “kiengedünk”.

Hogy hol van beállítva? Van egy pici konfigurációs file a /etc alatt.

root@gergo1:~# cat /etc/network/iptables.up.rules
# Generated by iptables-save v1.6.0 on Sat Aug 26 03:40:19 2017
*filter
:INPUT DROP [9:1026]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [22:3482]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
#
# added by gvamosi on 2019-06-07
#
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#
# added by gvamosi on 2019-09-22
#
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
#
COMMIT
# Completed on Sat Aug 26 03:40:19 2017

És hogyan “töltődik be”? Az ún. init script-ek között kell keresnünk a választ (leírásuk később).

root@gergo1:~# cat /etc/init.d/iptables
#!/bin/sh
echo -n "Applying firewall rules.."
/sbin/iptables-restore < /etc/network/iptables.up.rules
echo "done."

Ez a kicsi init script tölti be a rendszer elindulásakor a tűzfal konfigurációját az iptables-restore parancs segítségével. Ennyi az egész. 🙂

Írhatnánk még az ún. DMZ (Demilitarizált Zóna) fogalmáról is. Ez egy olyan terület egy cégnél pl., ahonnan szerverek “kifelé”, a nagyvilágba, azaz az Internet felé is látszódhatnak. Határzóna a belső, védett, és a külső, védtelen hálózat között.

Ethernet, bridging, switching, routing és a Linux router táblája

Először beszélnünk kell arról, hogy mi az az Ethernet. Az Ethernet a LAN (Local Area Network – helyi hálózat) hálózatokra kidolgozott szabvány. Működésének lényege, hogy hallgatózik az összes résztvevő, és ha “csend” van, akkor küldik az adatokat. Beszélünk ma 100 MBit-es (megabit per másodperc) Ethernetről és GBit-es (gigabit per másodperc) Ethernetről is. Ez az elméleti átviteli maximum, tipikusan a 66%-át lehet elérni rajta. 🙂

https://hu.wikipedia.org/wiki/Ethernet

Ez az a hálózat, ami otthonunkban, munkahelyünkön vagy akár egy kórházban használatos. Van az ún. CAT5-ös kábel, ez a 100 MBit/s -os átvitelhez szükséges UTP (Unshielded Twisted Pair – árnyékolatlan csavart érpár) kábel. Azért csavart – és ez már fizika a javából -, mert így kiegyenlítődnek rajta a zajok. Azért 230-as kábeltől a falban legalább 30-40 centiméterre illik vezetni, tipikusan kábelcsatornában. Plusz feladat, hogy mi az a patch- és a keresztkábel. 🙂

https://hu.wikipedia.org/wiki/UTP

Aztán a hálózati rétegek az ISO-OSI modellből. A 2-es, adatkapcsolati rétegen dolgozik a bridge és a switch is (ha nem layer 3 switch). A router pedig a hármas, hálózati rétegben. A bridge-ek hálózati szegmenseket kötnek össze, MAC-táblát tartanak nyilván. Hasonlóak a repeater-ekhez, bár ez utóbbiak csak jelismétlők (erősítők), és nagyobb távolágok áthidalására használják őket. Az UTP ugyanis 100-120 métert tud csak! A switch-ek több portos bridge-eknek tekinthetőek. 🙂

https://hu.wikipedia.org/wiki/Switch_(informatika)

Linux-unkkal akár bridge-elhetünk, akár switch-elhetünk, sőt még route-olhatunk is! Csak megfelelő interfészeket kell a “dobozba” tenni. A gyakorlatban egyébként ez is történik, csak kész eszközöket használunk, amik azért kisebbek egy PC-nél, és kevesebbet is fogyasztanak. Belsejükben Linux dolgozik. 🙂

Az én itthoni hálózatomban egy kábelmodemből egy router-be érkezik a jel. A router GigaBit-es Ethernet interfészekkel, két sávú WLAN-nal (vezeték nélküli hálózat) rendelkezik. Az egyik helységben van egy switch is, ami elosztóként működik, akár egy 230 V-os elosztó. 🙂 Van még egy konnektorba dugható picike Wi-Fi lefedettség növelőm, az emeletre – és nagyjából ennyi. Asztali gépek, hordozható számítógépek, tabletek, okostelefonok és az aktív és passzív hálózati eszközök (kábelek). 🙂

Összességben elmondható, hogy a Layer 2-es eszközök fizikai, Ethernet MAC-cím (Media Access Control) alapján végzik az összekapcsolást, a router-ek pedig IP-címeket adnak, tipikusan DHCP-vel (Dynamic Host Configuration Protocol), azaz automatikusan kiosztanak minden hálózati résztvevőnek egy (helyi) IP-címet, továbbá a Layer 3-ban “operálnak”. Ha megnézzük a tegnapi írást a hálózatról és az IP-címről, akkor volt ott egy ifconfig parancs, ami kíírta, hogy a Wi-Fi interfésznek “ether 5c:e0:c5:5d:e2:01” a fizikai, gyárilag beállított címe. Ez a MAC-cím. 🙂

https://hu.wikipedia.org/wiki/MAC-c%C3%ADm

Nézzük meg ezek után a Debian 10-es Linux-om router tábláját. Ezt root-ként (rendszergazdaként) érhetjük el, a route paranccsal. Mára jobbára automatikusan beállítódik minden Linux-on.

root@gergo1:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 600 0 0 wlp2s0
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 wlp2s0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp2s0

Látható a cél, a gateway, a netmaszk, pár adat és az interfész. Ami itt van az egy “sima” hálózatba kötés, Wi-Fi-n keresztül. A netmaszkról lehetne beszélnünk. Binárisan ÉS kapcsolattal az egy IP-alhálózathoz való tartozást fejezi ki, egyszerűen hozzá kell ÉS-elni az IP-címhez. A gateway-ról is szóljunk. Ez nem más, mint az átjárónk, azaz a router-ünk. IP-címe jelen esetben 192.168.0.1. Ezt ki is deríthetjük egyrészt a route -n, másrészt a traceroute parancs kimenetéből – miután apt-get install paranccsal felinstalláltuk. Keressük meg tehát a nic.bme.hu-t, a BME elsődleges DNS szerverét (Domain Name System). 🙂

root@gergo1:~# traceroute 152.66.115.1
traceroute to 152.66.115.1 (152.66.115.1), 30 hops max, 60 byte packets
1 _gateway (192.168.0.1) 7.562 ms 7.526 ms 7.575 ms
..
7 tg0-2-0-3-1110.rtr.bme.hbone.hu (195.111.103.205) 22.009 ms 25.032 ms 25.496 ms
8 xge0-0-0-0.rax.net.bme.hu (152.66.0.124) 32.333 ms 32.308 ms 32.283 ms
9 hge1-0-49.rio.net.bme.hu (152.66.0.67) 26.305 ms 27.216 ms 26.405 ms
10 nic.bme.hu (152.66.115.1) 29.336 ms 29.489 ms 30.286 ms

A DNS egyébként a névfeloldást végzi az Interneten. Egy szervernévhez szolgáltatja a hozzá tartozó IP-címet elosztott adatbázisból.

Általában igaz, hogy egy számítógép hálózatba kacsolásához IP-cím, netmaszk (ebből jön a hálózat-cím, ÉS kapcsolattal), a gateway és egy-két DNS-szerver szükséges. 🙂

Hálózat, IP-címek

A tegnapihoz tartozok még egy magyarázattal. A hálózati szereplőknek egyedi címük van, úgynevezett IP címük. Ez a korábban említett IP protokoll a TCP/IP-ből, az ISO-OSI modell harmadik, hálózati rétegéből.

A világot korábban az IPV4 szerint osztották fel. Az egyetemek többek között úgynevezett autonóm zónákat kaptak. A BME például a 152.66.XXX.XXX úgynevezett B osztályú hálózatot. Azért B osztályú, mert az az első két szám kitöltött, és 256×256 számítógépnek van rata hely. 4 oktet. 4 byte-os cím. Vannak A osztályú, illetve C osztályú hálózatok is ezen terminológia szerint. 🙂

https://hu.wikipedia.org/wiki/IP-cím

http://www.vlsm-calc.net/ipclasses.php

Egy idő után azonban kifogytak ezek az IPV4-es címek, ezért van mára IPV6. Ez jóval több számítógép világhálóra (Internetre) kötését teszi lehetővé. Az IPV6 címek 128 bit hosszúak. Ez sose fog kifogyni, pláne, hogy jelenleg is ún alhálózatokba vannak szervezve a gépek, ahol az egyes végpontoknak pl. egy kábel-hálózatnál csak belső IP-címük van – ezért nem lehet az otthoni gépből többek között webszervert csinálni. Elvileg az adatátviteli technológia szimmetrikus is lehetne, de erősen a letöltési sávszélesség nagyobb az otthoni gépünkön. A sok-sok web, játék és egyéb szervert az úgynevezett “gerinchálózatra” kötik, “szerverfarmokon”. Jelenleg egyébként a két címzési mód keverve van jelen a világban. 🙂

https://hu.wikipedia.org/wiki/IPv6

Ezek után nézzük meg a Debian 10-es Linux-unk hálózati interface konfigurációját. Az ifconfig paranccsal írhatjuk ki a hálózati interfészeinket root-ként (rendszergazdaként). Régebben a hálózatot manuálisan kellett beállítani, ma már pl. az otthoni wifi hálózatot teljesen automatikusan konfigurálja a rendszer. 🙂

root@gergo1:~# ifconfig
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 27044 bytes 2149063 (2.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27044 bytes 2149063 (2.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp2s0: flags=4163 mtu 1500
inet 192.168.0.173 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::60da:3b20:dfeb:9fe0 prefixlen 64 scopeid 0x20
ether 5c:e0:c5:5d:e2:01 txqueuelen 1000 (Ethernet)
RX packets 1241841 bytes 1315097554 (1.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 593763 bytes 132026415 (125.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Jól látható a wlp2s0 interface konfigurációja, a “lo” – localhost, konfigurációja után. A belső hálózati IP-címünk a 192.168.0.173. 🙂

Portszkennelés (Port Scan) Linux alatt – nmap, hálózati kapcsolatok – netstat

Telepítettem a napokban régi jó szoftvercsomagomat, az nmap-et is. Beszéltünk róla, hogy Linux alatt 0-65535-ig (2^16-1) számozottak a portok. Egy port lehet TCP (Transmission Control Protocol – kapcsolatorientált, byte-stream jellegû, megbízható protokoll, pl. “on-demand” kép- és hangátvitel, letöltés, mivel a TCP egy megbízható protokoll, újra küldi az “elveszett” csomagokat) vagy UDP (User Datagram Protocol – összeköttetésmentes protokoll, pl. élő kép- és hangátvitel, online játékok – hibaellenőrzés és csomag újraküldés nélküli “kis adatcsomagocskák”).

https://support.holmsecurity.com/hc/en-us/articles/212963869-What-is-the-difference-between-TCP-and-UDP-

Miután kapcsolódtunk a böngészőnkkel pl. a HTTP 80-as szerverportra, egy ún. “socket” nyílik a szerveren, és a kliens egy 1024-nél magasabb portszámmal kapcsolódik. Ez minden hálózati szolgáltatásnál ugyanígy működik.

http://www.steves-internet-guide.com/tcpip-ports-sockets/

Felmerülhet a kérdés, hogy mennyi kliens-szerver kapcsolat lehetséges. Egy kliens max. 65535 kapcsolatot nyithat egy szerverre, de egy szerver 65535 kapcsolatot tarthat fent kliensenként! Határ a memória és a cpu! 🙂

https://serverfault.com/questions/533611/how-do-high-traffic-sites-service-more-than-65535-tcp-connections

Az alábbiakban egy nem teljeskörű lista látható az alapvető Linux (UNIX) portokról. Az 1024-nél alacsonyabb portszámok a root (rendszergazda) felhasználóhoz kötöttek. A portok többsége TCP.

20 – FTP Data (FTP adatátvitel)
21 – FTP Control (FTP kapcsolat indítása)
22 – SSH (biztonságos távoli adminisztráció, SSL-lel kódolt csatornán)
23 – Telnet (kódolatlan távoli adminisztráció)
25 – SMTP (Mail Transfer Agent, e-mail szerver, mint pl. SEND mail)
53 – DNS (TCP és UDP is)
67 – Bootp
68 – DHCP
69 – TFTP (Trivial file transfer protocol, UDP, "kapcsolat nélküli" adatátvitel)
80 – HTTP/WWW(Apache)
88 – Kerberos
110 – POP3 (Mail delivery Agent)
123 – NTP (Network time protocol idő szinkronizálásra, UDP)
137 – NetBIOS (nmbd)
139 – SMB-Samba (smbd)
143 – IMAP
161 – SNMP (hálózatfelügyelet)
389 – LDAP (központi adminisztráció)
443 – HTTPS (HTTP+SSL biztonságos web elérés)
514 – Syslogd (UDP port)
636 – ldaps (TCP és UDP is)
873 – rsync
989 – FTPS-data
990 – FTPS
993 – IMAPS
1194 – openVPN
1812 – RADIUS
995 – POP3s
2049 – NFS (nfsd, rpc.nfsd, rpc, portmap)
2401 – CVS server
3306 – MySql
3690 – SVN
6000-6063 – X11

A hálózatokat leíró ún. ISO-OSI referenciamodellről az alábbi linkek alatt olvashatunk részleteket. Jól látható az a bizonyos hét réteg, melyen keresztül minden hálózati kapcsolat megvalósul. Az SSH szolgáltatás – ahogy a többi is – az alkalmazási (7-es) réteg része, de minden bitje átmegy a fizikai (1-es) rétegen!

https://hu.wikipedia.org/wiki/OSI-modell

https://www.studytonight.com/computer-networks/complete-osi-model

Az nmap segítségével egy szerverről kideríthető, hogy mely portokon vannak szolgáltatások telepítve. Eresszünk rá egy egyszerű scan-t a localhost-ra! 🙂

gvamosi@gergo1:~$ nmap -A -T4 localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2019-09-19 10:09 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10 (protocol 2.0)
| ssh-hostkey:
| 2048 5f:9c:30:d8:aa:23:5a:d2:8b:52:ff:22:cf:c0:ae:6d (RSA)
| 256 3e:25:ef:3e:78:88:07:47:8d:76:67:ce:91:dc:8d:d4 (ECDSA)
|_ 256 d6:8f:00:80:43:8a:c7:05:dc:b4:2b:de:96:c3:12:fb (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: Apache2 Debian Default Page: It works
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
Service Info: Host: GERGO1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|clock-skew: mean: -40m00s, deviation: 1h09m16s, median: 0s |_nbstat: NetBIOS name: GERGO1, NetBIOS user: , NetBIOS MAC: (unknown) | smb-os-discovery: | OS: Windows 6.1 (Samba 4.9.5-Debian) | Computer name: gergo1 | NetBIOS computer name: GERGO1\x00 | Domain name: \x00 | FQDN: gergo1 | System time: 2019-09-19T10:10:03+02:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2019-09-19 10:10:03
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.11 seconds

Látható, hogy a 22-es, 80-as, 139-es és 445-ös portokon találhatóak “nyílt” portok. Ezt tudhatom fejből is, mivel SSH szervert, HTTP szervert, és Windows-os ún. Samba szervert telepítettem, a hálózaton lévő Windows-os gépekkel való adatátvitelhez. 🙂

Végül nézzünk meg egy még egyszerűbb portszkent! (Figyelem: bizonyos szkenek – pl. UDP – root hozzáférést igényelnek.) 🙂

gvamosi@gergo1:~$ nmap localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2019-09-19 10:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds

Végül nézzük meg a netstat parancs kimenetelét (miután a net-tools-t felinstalláltuk). A netstat minden hálózati kapcsolatot feltérképez. Jól láthatóak a https kapcsolatok és az ún. ephemeral portok kliens (gergo1) oldalon. Ezek magasabb portszámok – és nálam sok tab van nyitva a Chrome-ban. 🙂

root@gergo1:~# apt-get install net-tools
..
root@gergo1:~# logout
gvamosi@gergo1:~$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 gergo1:44450 13.94.251.244:https ESTABLISHED
tcp 0 171 gergo1:44860 109.233.153.16:https FIN_WAIT1
tcp 0 0 gergo1:57636 ws-in-f188.1e100.n:5228 ESTABLISHED
tcp 0 1 gergo1:58322 40.68.210.8:https FIN_WAIT1
tcp 0 1 gergo1:50668 wo-in-f188.1e100.n:5228 FIN_WAIT1
tcp 0 0 gergo1:56840 104.16.190.66:https ESTABLISHED
tcp 0 1 gergo1:44206 13.94.251.244:https FIN_WAIT1
tcp 0 1 gergo1:52762 13.94.112.175:https FIN_WAIT1
tcp 0 0 gergo1:40996 68.232.34.200:https ESTABLISHED
tcp 0 0 gergo1:60478 e1-ha.ycpi.via.ya:https ESTABLISHED
tcp 0 0 gergo1:48022 52.114.158.92:https TIME_WAIT
tcp 0 1 gergo1:51022 13.107.3.128:https FIN_WAIT1
..
tcp 0 0 gergo1:59514 edge-star-shv-01-:https ESTABLISHED
tcp 0 0 gergo1:51986 xx-fbcdn-shv-01-v:https ESTABLISHED
tcp6 0 0 192.168.0.109:45541 13.69.158.96:https ESTABLISHED
tcp6 0 74 192.168.0.109:41903 13.69.158.96:https FIN_WAIT1
udp 0 0 gergo1:40680 prg02s12-in-f10.1e1:443 ESTABLISHED
udp 0 0 gergo1:40731 bud02s28-in-f8.1e10:443 ESTABLISHED
udp 0 0 gergo1:41421 bud02s26-in-f14.1e1:443 ESTABLISHED
udp 0 0 gergo1:33400 wn-in-f189.1e100.ne:443 ESTABLISHED
udp 0 0 gergo1:41687 bud02s27-in-f2.1e10:443 ESTABLISHED
udp 0 0 gergo1:33916 bud02s26-in-f14.1e1:443 ESTABLISHED
udp 0 0 gergo1:54408 wb-in-f189.1e100.ne:443 ESTABLISHED
udp 0 0 gergo1:38164 muc03s07-in-f99.1e1:443 ESTABLISHED
udp 0 0 gergo1:47052 muc03s07-in-f110.1e:443 ESTABLISHED
udp 0 0 gergo1:52313 ham02s13-in-f14.1e1:443 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 32111 /var/lib/samba/private/msg.sock/1547
unix 2 [ ] DGRAM 31112 /var/lib/samba/private/msg.sock/1602
unix 3 [ ] DGRAM 11603 /run/systemd/notify
unix 19 [ ] DGRAM 11622 /run/systemd/journal/dev-log
unix 7 [ ] DGRAM 11635 /run/systemd/journal/socket
unix 2 [ ] DGRAM 11664 /run/systemd/journal/syslog
unix 2 [ ] DGRAM 23637393 /run/wpa_supplicant/p2p-dev-wlp2s0
..

Sőt, így a végére még UNIX domain socket-ek is jutnak. 🙂 Ezek file alapú IPC (inter-process communication) socket-ek. 🙂

Telnet, HTTP 80-as port

Fel kellett installálnom a szokásos apt-get install paranccsal a telnet csomagot. Úgy látszik már annyira kiment a divatból ez az ódon parancs, hogy fenn sincs a distribution-ban alapból. 🙂

Régebben két Linux (UNIX) gép között leginkább csak a telnet parancs volt. Ez kódolatlan plain text (sima szöveges) adatátvitel két hálózati szereplő között. Hja, “biztonság”, hol volt akkor még. Védett és zárt egyetemi hálózatokon keresztül két professzor “talkolt” a cső két végén. 🙂

Nézem, hogy van nálam fenn webszerver (apache). Akkor próbáljuk ki a telnet parancsot! Első paramétere a hoszt, második a portszám, ez 0 – 65535-ig (2^16-1) lehet egy egész szám. (Linux-on – ahogy minden más hálózatba kötött gépen – a szolgáltatások portokon csücsülnek.)

gvamosi@gergo1:~$ telnet localhost 80
Trying ::1…
Connected to localhost.
Escape character is '^]'.
GET /info.php

A HTTP protokoll a 80-as porton kommunikál. Ez az egész világon így van alapból. Végső soron a HTTPS 443-as port is ugyanez, csak az még be van “csomagolva” egy secure (biztonságos) layer-be (rétegbe). 🙂 Miután beírtuk a terminálba, hogy GET /info.php, jön a php info oldal a www root-ból (/var/www/html).

gvamosi@gergo1:~$ ls -l /var/www/html
total 16
-rw-r--r-- 1 root root 10701 Aug 28 2017 index.html
-rw-r--r-- 1 root root 20 Aug 28 2017 info.php

A www root lekérdezése egész egyszerűen a “GET /” kéréssel lehetséges. Az escape karakter a “ctrl+]” billentyű-kombóval érhető el. Kérdem én: magyar billentyűzeten ez hogyan lehetséges? Persze nálam többnyire angol van. Az escape beírása után pl. quit paranccsal juthatunk vissza a command shell-ünkbe. Ennyi az egész! 🙂 Jól látható az egész TCP/IP protokoll csővezeték volta, és a HTTP egyszerűsége. Végsősoron minden protokoll hasonlóképpen működik, többek között az SMTP is hasonlóan vezérelhető plain text parancsokkal.

Zombi-gyilkolás :)

A folyamatok státusza a top parancs képernyője szerint lehet “running” – “futó“, “sleeping” – “alvó“, “stopped” – “megállított“, illetve “zombie” – “zombi“.

A tegnapi secure shell-es lecke megírása közben véletlenül lehajtottam a Linux notebook képernyőjét, azaz összecsuktam a gépet. Közben az asztali Mac mini-ről bejelentkezve maradtam.

Ilyenkor egy bennragadt shell processzről van szó. Majdhogynem zombi. Persze valójában nem az. Zombit ugyanis nem lehet kill-elni, mivel a zombi processz már “halott”. Akkor tűnik el a processztáblából, ha a szülő processzét kinyírtuk. 🙂

A szülő processz id-ket ps all vagy céltudatosabban a ps -A -ostat,pid,ppid paranccsal írhatjuk ki. Ez utóbbinál az ostat ha z vagy Z, akkor van szó zombi processzről, a pid a processz azonosító, a ppid pedig a szülő folyamaté. Bővebben az alábbi linken lehet erről olvasni.

https://stackoverflow.com/questions/16944886/how-to-kill-zombie-process

Hogy hogyan lőttem ki kill -9-cel a bennragadt bash processzt, lásd az alábbiakban.

gvamosi@gergo1:~$ w
23:56:28 up 2 days, 13:11, 2 users, load average: 1.16, 0.91, 0.94
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
gvamosi tty2 tty2 Sat10 2days 1:39m 11.13s /opt/google/chrome/chrome --type=renderer --field-trial-handle=15503761646981189628,17074726826077816693,131072 --lang=en-US --enable-auto-reload
gvamosi pts/1 192.168.0.113 18:21 5:35m 0.00s 0.00s -bash
gvamosi@gergo1:~$ ps axu | grep bash
gvamosi 5312 0.0 0.0 7300 3612 pts/0 Ss Sep14 0:00 -bash
gvamosi 26716 0.0 0.0 6076 876 pts/0 S+ 23:56 0:00 grep bash
gvamosi 32208 0.0 0.0 7188 3884 pts/1 Ss+ 18:21 0:00 -bash
gvamosi@gergo1:~$ kill -9 32208
gvamosi@gergo1:~$ ps axu | grep bash
gvamosi 5312 0.0 0.0 7300 3612 pts/0 Ss Sep14 0:00 -bash
gvamosi 27005 0.0 0.0 6076 884 pts/0 S+ 23:56 0:00 grep bash
gvamosi@gergo1:~$ w
23:56:56 up 2 days, 13:12, 1 user, load average: 1.04, 0.90, 0.93
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
gvamosi tty2 tty2 Sat10 2days 1:39m 11.14s /opt/google/chrome/chrome --type=renderer --field-trial-handle=15503761646981189628,17074726826077816693,131072 --lang=en-US --enable-auto-reload
gvamosi@gergo1:~$

A w paranccsal megnéztem, hogy pts/1-en “benn maradtam” a szerverként szolgáló notebook-on gvamosi felhasználó név alatt (2 users). Utána ps paranccsal megkerestem azt a bash shell-t, ami szintén a pts/1-hez van rendelve. Ezután elég volt egy kill -9 PID – processz azonosító, azaz kill -9 32208 parancs. Jól látható az utána kiadott w parancs után, hogy eltűnt a “bennragadt” felhasználó (1 user). 🙂

Secure Shell – biztonságos távkapcsolat két számítógép között – ssh, scp egy Mac mini OS X és egy Linux között

Két Linux/UNIX alapú számítógép között a biztonságos kapcsolatot, titkosított adatátvitelt az úgynevezett secure shell, azaz ssh kapcsolat jelenti. Alapvetően kliens-szerver kapcsolat, és rémesen egyszerű, ha az ember egyszer ráérez.

Először is felfedeztem, hogy az sshd, ssh daemon – vagyis a szerver – nincs installálva a Debian 10-em alatt. No ezen könnyű volt segíteni. Debian alatt alapvetően az apt-get install paranccsal lehet valamit telepíteni (rendszergazdaként). Kapásból legenerálja a szükséges kulcsokat, úgyhogy nem sok dolog van vele. 🙂

root@gergo1:~# apt-get install ssh
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following additional packages will be installed:
openssh-server openssh-sftp-server
Suggested packages:
molly-guard monkeysphere rssh ssh-askpass ufw
The following NEW packages will be installed:
openssh-server openssh-sftp-server ssh
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 599 kB of archives.
After this operation, 1,829 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://cdn-fastly.deb.debian.org/debian buster/main amd64 openssh-sftp-server amd64 1:7.9p1-10 [44.6 kB]
Get:2 http://cdn-fastly.deb.debian.org/debian buster/main amd64 openssh-server amd64 1:7.9p1-10 [352 kB]
Get:3 http://cdn-fastly.deb.debian.org/debian buster/main amd64 ssh all 1:7.9p1-10 [202 kB]
Fetched 599 kB in 2s (388 kB/s)
Preconfiguring packages …
Selecting previously unselected package openssh-sftp-server.
(Reading database … 488002 files and directories currently installed.)
Preparing to unpack …/openssh-sftp-server_1%3a7.9p1-10_amd64.deb …
Unpacking openssh-sftp-server (1:7.9p1-10) …
Selecting previously unselected package openssh-server.
Preparing to unpack …/openssh-server_1%3a7.9p1-10_amd64.deb …
Unpacking openssh-server (1:7.9p1-10) …
Selecting previously unselected package ssh.
Preparing to unpack …/ssh_1%3a7.9p1-10_all.deb …
Unpacking ssh (1:7.9p1-10) …
Setting up openssh-sftp-server (1:7.9p1-10) …
Setting up openssh-server (1:7.9p1-10) …
Creating config file /etc/ssh/sshd_config with new version
Creating SSH2 RSA key; this may take some time …
2048 SHA256:dOGw/PajE/BBgatmagHg384uQbysjJY2wr6m8WCkfus root@gergo1 (RSA)
Creating SSH2 ECDSA key; this may take some time …
256 SHA256:j8q+pBRwTqbiAvP1X4pL+pHUj7G4aoojCBGv7FYqWIE root@gergo1 (ECDSA)
Creating SSH2 ED25519 key; this may take some time …
256 SHA256:yn8li9pazT1UXV3T+gmo44boWeJU1S6HA7bKDgVpKc0 root@gergo1 (ED25519)
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.
rescue-ssh.target is a disabled or a static unit, not starting it.
Setting up ssh (1:7.9p1-10) …
Processing triggers for man-db (2.8.5-2) …
Processing triggers for systemd (241-5) …

Aztán az első “belépés” OS X-ről az ssh paranccsal. A Linux gép ip címe 192.168.0.109, lekérdezni command prompt-ból OS X alatt az “ifconfig“, Debian alatt az “ip addr“, illetve az “ip a” paranccsal lehet. Természetesen a hálózatban “belső ip címeket” használunk, az összes gép “tűzfal mögött” van. 🙂

Mac-mini:~ gvamosi$ ssh 192.168.0.109
The authenticity of host '192.168.0.109 (192.168.0.109)' can't be established.
ECDSA key fingerprint is SHA256:j8q+pBRwTqbiAvP1X4pL+pHUj7G4aoojCBGv7FYqWIE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.109' (ECDSA) to the list of known hosts.
gvamosi@192.168.0.109's password:
Linux gergo1 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Sep 4 07:08:30 2019
gvamosi@gergo1:~$

Ezek után a w (who is) paranccsal megnézhetjük a bejelentkezetteket.

gvamosi@gergo1:~$ w
18:21:32 up 2 days, 7:36, 2 users, load average: 0.33, 0.60, 0.61
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
gvamosi tty2 tty2 Sat10 2days 1:24m 0.64s /opt/google/chrome/chrome --type=renderer --field-trial-handle=15503761646981189628,17074726826077816693,131072 --lang=en-US --enable-auto-reload
gvamosi pts/1 192.168.0.113 18:21 10.00s 0.00s 0.00s -bash

Látható, hogy a pts/1-en a 192.168.0.113-as IP címről van egy belépett “távoli” felhasználónk. 🙂

És akkor nézzük meg azt a trükköt, hogy ne kérjen többet jelszót, és másoljunk át scp-vel egy file-t. Ezt ezután akár egy automatikus processz (tipikusan egy script) is elvégezheti, pl. mentésbackup – céljából. Ezekről a későbbiekben írok majd bővebben. 🙂

Mac-mini:~ gvamosi$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/gvamosi/.ssh/id_rsa):
/Users/gvamosi/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/gvamosi/.ssh/id_rsa.
Your public key has been saved in /Users/gvamosi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:8DpEyLqQO78UnwTlsbdhjxklU7o459DqmUC84Pc6jVs gvamosi@Mac-mini.local
The key's randomart image is:
+---[RSA 2048]----+
| o o.o |
| + + = |
| . = O |
| o o * @ |
|+ = = O S |
|.= * O . |
|o.=.*E+ |
| +.=o+ . |
| o+B. |
+----[SHA256]-----+
Mac-mini:~ gvamosi$ less .ssh/id_rsa.pub
Mac-mini:~ gvamosi$ ssh 192.168.0.109
gvamosi@192.168.0.109's password:
Linux gergo1 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Sep 16 17:40:12 2019 from 192.168.0.113
gvamosi@gergo1:~$ vi .ssh/authorized_keys
gvamosi@gergo1:~$ logout
Connection to 192.168.0.109 closed.
Mac-mini:~ gvamosi$ ssh 192.168.0.109
Linux gergo1 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Sep 16 17:42:13 2019 from 192.168.0.113
gvamosi@gergo1:~$ logout
Connection to 192.168.0.109 closed.
Mac-mini:~ gvamosi$ scp ownCloud/Photos/San\ Francisco.jpg 192.168.0.109:
San Francisco.jpg 100% 211KB 211.0KB/s 00:00
Mac-mini:~ gvamosi$

Mi is történik? Először kulcsot kenerálunk OS X alatt az ssh-keygen paranccsal. Aztán a publikus rsa kulcsot (RSA: Rivest-Shamir-Adleman – titkosítási rendszer nyilvános kulcsú titkosításhoz, bemutatása később) átmásoljuk a Linuxszerverre” az authorized_keys file-ba.

Utána csodák csodája már nem kér jelszót. 🙂

Ezután scp-vel átmásoljuk a “San Francisco.jpg” file-t.

Környezeti változók Linux alatt

Beállítani egy környezeti változót az export paranccsal lehet.

gvamosi@gergo1:~$ export KERESS_PENZT_LINUXSZAL=gvamosi.worpress.com

Kiírni egy környezeti változó értékét pedig mi sem egyszerűbb.

gvamosi@gergo1:~$ printenv KERESS_PENZT_LINUXSZAL
gvamosi.worpress.com
gvamosi@gergo1:~$ echo $KERESS_PENZT_LINUXSZAL
gvamosi.worpress.com

Az összes környezeti változót a set, env vagy printenv paranccsal kérdezhetjük le.

gvamosi@gergo1:~$ printenv | sort
COLORTERM=truecolor
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DESKTOP_SESSION=gnome
DISPLAY=:0
GDM_LANG=en_US.UTF-8
GDMSESSION=gnome
GJS_DEBUG_OUTPUT=stderr
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/12b6ca2c_41b1_4c0d_81ab_573afc40b82a
GNOME_TERMINAL_SERVICE=:1.91
GTK_MODULES=gail:atk-bridge
HOME=/home/gvamosi
KERESS_PENZT_LINUXSZAL=gvamosi.worpress.com
LANG=en_US.UTF-8
LOGNAME=gvamosi
OLDPWD=/home/gvamosi/Documents/irasok/Andreas_Witt-Egy_kidobott_ferfi_elete-20190418-Nagycsutortok
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:.
PWD=/home/gvamosi
QT_ACCESSIBILITY=1
QT_IM_MODULE=ibus
SESSION_MANAGER=local/gergo1:@/tmp/.ICE-unix/1075,unix/gergo1:/tmp/.ICE-unix/1075
SHELL=/bin/bash
SHLVL=0
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
TERM=xterm-256color
USER=gvamosi
USERNAME=gvamosi
_=/usr/bin/printenv
VTE_VERSION=5402
WAYLAND_DISPLAY=wayland-0
XDG_CURRENT_DESKTOP=GNOME
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=gnome
XDG_SESSION_ID=2
XDG_SESSION_TYPE=wayland
XDG_VTNR=2
XMODIFIERS=@im=ibus

Egy környezeti változót az unset paranccsal “törölhetünk”.

Magyarázat néhány környezeti változóhoz:

USER: az aktuáisan bejelentkezett felhasználó
HOME: a bejelentkezett felhasználó home könyvtára
SHELL: az aktuális felhasználó shell-je
LOGNAME: az aktuális felhasználó neve
PATH: a keresési útvonal parancsok végrehajtásakor (TAB billentyű)
LANG: az aktuális nyelvi beállítás
TERM: az aktuális terminálemuláció

Bővebben az alábbi weboldalon lehet a környezeti változókról olvasni.

https://linuxize.com/post/how-to-set-and-list-environment-variables-in-linux/

Boole-algebra és shell script

Az és, a vagy és a negáció műveletei igen fontosak. Nézzünk egy egyszerű példát.

[ "$#" -ne 2 ] && { echo "Nem megfelelő argumentumszám"; exit; }

Hogy ez hogyan működik egy képzeletbeli script elején? Az && és kapcsolatot fejez ki. Tehát ha nem 2 argumentumot kap a script, akkor kíír egy üzenetet és kilép a programocskból. 🙂 Hogyan lehet ezt megfordítani?

[ "$#" -eq 2 ] || { echo "Nem megfelelő argumentumszám"; exit; }

Az eredmény ugyanaz. A || vagy kapcsolatot fejez ki. Vagy egyenlő 2-vel az argumentum szám, vagy kilép a programból. Az első script részlet algebrailag (A != B) és (igaz), a második (A == B) vagy (igaz).

Az egyik legfontosabb szabály, hogy a nem-és felcserélhető igen-vagy-ra. 🙂

További részletek a Boole-algebráról az alábbi linkeken.

https://hu.wikipedia.org/wiki/Boole-algebra_(informatika)

https://hu.wikipedia.org/wiki/Boole-algebra

Linux parancsok III. – folyamat (processz vagyis process) kezelés

A rendszer illetve felhasználói folyamatok változását a top paranccsal követhetjük nyomon.

gvamosi@gergo1:~$ top
top - 14:07:27 up 10 days, 23:46, 1 user, load average: 1.25, 1.64, 1.48
Tasks: 296 total, 1 running, 295 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.6 us, 2.7 sy, 0.0 ni, 90.2 id, 0.1 wa, 0.0 hi, 0.4 si, 0.0 st
MiB Mem : 7787.5 total, 338.1 free, 5721.7 used, 1727.8 buff/cache
MiB Swap: 7999.0 total, 5819.9 free, 2179.1 used. 1256.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2344 gvamosi 20 0 1374840 286664 77172 S 4.5 3.6 12:53.42 chrome
1078 gvamosi 20 0 3845288 419172 154072 S 4.3 5.3 65:51.87 gnome-shell
651 root 20 0 242112 7888 4120 S 3.3 0.1 44:46.06 polkitd
618 message+ 20 0 10980 4864 2812 S 2.5 0.1 34:15.79 dbus-daemon
9875 gvamosi 20 0 786732 142276 37384 S 2.2 1.8 16:27.54 chrome
2572 gvamosi 20 0 746960 250692 171320 S 2.0 3.1 52:54.91 chrome
2535 gvamosi 20 0 1605200 350008 59044 S 1.2 4.4 57:11.69 chrome
1277 gvamosi 20 0 802672 11396 6860 S 1.0 0.1 12:39.06 gsd-power
259 root 20 0 78056 22700 12216 S 0.7 0.3 7:51.31 systemd-journal
2577 gvamosi 20 0 424236 79836 18900 S 0.7 1.0 13:30.91 chrome
2898 gvamosi 20 0 720348 135476 39892 S 0.5 1.7 6:50.90 chrome
5869 gvamosi 20 0 425680 27296 18704 S 0.5 0.3 1:03.25 gnome-terminal-
24660 root 20 0 23136 2064 1584 S 0.5 0.0 0:02.33 systemd-udevd
626 root 20 0 236956 4252 3864 S 0.3 0.1 4:11.97 iio-sensor-prox
710 root 20 0 1419904 3700 3476 S 0.3 0.0 5:10.92 libvirtd
2891 gvamosi 20 0 1622204 368832 71120 S 0.3 4.6 15:17.82 chrome
3038 gvamosi 20 0 846480 219688 52028 S 0.3 2.8 18:07.01 chrome
6242 gvamosi 20 0 631976 58680 22788 S 0.3 0.7 1:53.68 chrome
6382 gvamosi 20 0 654012 77832 22240 S 0.3 1.0 1:58.41 chrome
31699 gvamosi 20 0 11592 4068 3188 R 0.3 0.1 0:00.30 top
1 root 20 0 170984 7468 5340 S 0.2 0.1 3:27.43 systemd

Jól látható a tetején az “up” azaz 10 napja volt elindítva a gép – persze közben volt sleep státuszban 🙂 -, aztán hogy 1 felhasználó van bejelentkezve, és hogy a load, azaz a kihasználtsága a rendszernek körülbelül 1,5 – ami jónak mondható.

Aztán a folytatásban a teljes taszkok (folyamatok) száma 296, amiből egy van “running”, azaz “futó” státuszban.

Majd a processzor kihasználtság százalékokban: felhsználó, rendszer, idle. Ezt követi a memória és a swap kihasználtsága. 🙂

Ezen általános rendszer-mérőszámok után következnek a processzek, vagyis a folyamatok, pid – processz id-vel, tulajdonos user-rel (többnyire gvamosi, illetve root a példában), mindenféle memóriafoglaltságokkal és cpu (processzor) használattal, végül az eddigi futási idő összesen és a parancs neve. 🙂

Fontos parancs még a teljes processz lista lekérése, a ps axu. Ez az összes processz kilistázása a rendszeren.

gvamosi@gergo1:~$ ps axu | less

Ebben a listában szemügyre vehetjük, a top kimenetéhez hasonlóan, hogy ki mit futtat, illetve mennyi erőforrást vesznek igénybe az egyes folyamatok.

Ha megszámoljuk a sorokat a wc -l (word count) paranccsal, akkor a topban kapott “Tasks total” számot + egyet, a fejléc miatt – kell kapjunk. 🙂

gvamosi@gergo1:~$ ps axu | wc -l
286

Látható, hogy a top parancs óta pár folyamat “bezáródott”.

Nézzük még meg a kill parancsot. Bemutatom, hogyan lehet saját magunk alatt kivágni vele a “fát”. Előbb lekérdezzük a bash shell-ünk id-jét a ps paramccsal, majd -9 -es killel termináljuk a saját shell-ünk. 🙂

gvamosi@gergo1:~$ ps
PID TTY TIME CMD
20646 pts/0 00:00:00 bash
20733 pts/0 00:00:00 ps
gvamosi@gergo1:~$ kill -9 20646

A folyamatokról a teljes leírást státuszdiagrammal az alábbiakban olvashatjuk (angolul).

https://www.tecmint.com/linux-process-management/