ugrás a tartalomhoz

Hogyan érdemes Linux felhasználókat létrehozni egy szerveren?

inf · 2016. Feb. 23. (K), 03.34
Nem nagyon foglalkoztam üzemeltetéssel eddig (ezután is csak saját célra fogok, nem kell megijedni). Dereng valami, hogy érdemes külön felhasználót létrehozni az alkalmazásoknak, amik a szerveren fognak futni. Pl adatbázisok általában létrehozzák a saját felhasználóikat (postgres, neo4j, stb.). Így ha megtörik a szervert, akkor postgres felhasználóval tudnak csak shell command-eket kiadi, nem root-al, ami gondolom előnyösebb. Gondolom webszervereknél, samba szervernél, ssh-nál, stb. ugyanilyen veszély fennáll. Úgy sejtem, hogy ez egy hatalmas témakör, és talán még a best practice-ek felsorolása sem fér bele ebbe a fórumba, szóval örülnék linkeknek.

Illetve a konkrét kérdés most nekem az lenne, hogy nodejs-t pm2-vel hogyan tudnám fellőni úgy, hogy ne root jogokkal fusson? Láttam már olyat, hogy magába a js kódban kellett azt hiszem a process-nél megadni az uid-t és gid-t. Ez nekem nem jön be, szívesebben kötném parancssorból indításnál felhasznáóhoz és csoporthoz az alkalmazás, ha ez lehetséges.
 
1

Ha nem root felhasználóval

Hidvégi Gábor · 2016. Feb. 23. (K), 12.34
Ha nem root felhasználóval indítod a node.js-t, akkor az ő jogaival fog futni.

A postgresql-t például a következőképp lehet szerverindításkor adott felhasználó jogaival futtatni:
Different systems have different conventions for starting up daemons at boot time. Many systems have a file /etc/rc.local or /etc/rc.d/rc.local. Others use init.d or rc.d directories. Whatever you do, the server must be run by the PostgreSQL user account and not by root or any other user. Therefore you probably should form your commands using su postgres -c '...'. For example:

su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'
2

Olvasgatok én is. CentOS-en

inf · 2016. Feb. 23. (K), 14.40
Olvasgatok én is. CentOS-en van olyan, hogy www user, aminek nincs se home mappája se shellje. Ezek szerint nekem is ilyesmi kéne a nodejs alá.

Elvileg valami ilyesmi kellene nekem: `pm2 startup -u www`, ahhoz, hogy www jogkörökkel indítson minden nodejs appot. Ennyi talán elég is. Van még olyan feature, hogy belőni egy-egy app-nál config fájlban, hogy milyen felhasználó futtassa, de az már nem működik, legalábbis másfél éve volt vita róla, hogy nem lesz ilyen. Na majd tesztelem ezt. Ha nem sikerül a process-eket www felhasználóként futtatni, akkor valszeg váltok vissza forever-re, ami sokkal fapadosabb, de legalább tud ilyen feature-t. Root-ként futtatva más is azt mondja, hogy nem biztonságos.

Nem tudom, hogy a pm2 elviseli e, ha nem root-ként indítom, mert egy csomó helyre ír logokat. Ez is egy lehetőség végülis. Kipróbálom, aztán max átírom az init.d scriptet vagy micsodát, ami indítja. Nem találtam init.d-ben amúgy annak idején, de nem néztem körül alaposan.
3

Szervereket valamilyen

Joó Ádám · 2016. Feb. 24. (Sze), 02.10
Szervereket valamilyen supervisorra szokás bízni, CentOS-en ez a systemd lesz. A hozzátartozó konfigfájlban tudod megadni, hogy milyen felhasználóval fusson, ha nem akarod roottal futtatni, akkor érdemes neki egy saját felhasználót létrehozni, nem egy már létezőnek adni.
4

Nem CentOS-ről van szó, azt

inf · 2016. Feb. 24. (Sze), 09.25
Nem CentOS-ről van szó, azt csak példának hoztam fel, hogy annál hogyan oldják meg. Az nem teljesen világos, hogyha létrehozok külön felhasználót neki, akkor annak milyen jogokat kellene kapnia. Egyébként Ubuntu server 14.04-ről van szó.
6

15.04-től az Ubuntu is

Joó Ádám · 2016. Feb. 24. (Sze), 17.28
15.04-től az Ubuntu is systemd-t használ, a 14.04 még Upstartot. Ami a jogokat illeti, a lehető legkevesebbet (lásd principle of least privilege), csak azokhoz a fájlokhoz adj neki és csak olyan hozzáférést, ami a feladata ellátáshoz feltétlenül szükséges.
7

És honnan fogom tudni, hogy

inf · 2016. Feb. 24. (Sze), 17.55
És honnan fogom tudni, hogy melyik fájlok kellenek nodejs futtatáshoz? :-)

Systemd jobb annyival, hogy érdemes lenne váltani másik verzióra? Nekem talán fontosabb, hogy x évig legyen support a verzióra, és a 14.04 LTS.
10

Ha rendszerszinten

Joó Ádám · 2016. Feb. 24. (Sze), 18.23
Ha rendszerszinten telepítetted a Node-ot, akkor minden felhasználó fogja tudni futtatni, az alkalmazásodhoz tartozó fájlokhoz kell csak hozzáférést adj az új felhasználónak.

A systemd láthatóan a de facto initrendszer lesz a belátható jövőben, míg az Upstart mögött a Canonical állt, és most, hogy végül az Ubuntu is systemd-re váltott, szerintem meg vannak számlálva a napjai. Ezért talán érdemesebb a systemd megismerésébe időt fektetni, de ezen kívül az Upstart is használható rendszer.
11

14.04-re sajna nem lehet

inf · 2016. Feb. 24. (Sze), 18.59
14.04-re sajna nem lehet feltelepíteni. Lehet, hogy később váltok 15-re helyette, mert ahogy nézem az LTS nem sokat ér, ha a szoftverek felett eljár az idő közben.
12

Igen, ezt elfelejtettem

Joó Ádám · 2016. Feb. 24. (Sze), 19.23
Igen, ezt elfelejtettem hozzátenni :)
5

Puppet

janoszen · 2016. Feb. 24. (Sze), 15.19
Alapvetoen ezt ugy szokas megoldani, hogy a konfiguracio-management rendszer (pl Puppet) letrehozza a szukseges "dolgokat" a kulonbozo alkalmasaidnak (pl. NodeJS; user, konyvtar, konfiguracios fajlok). A NodeJS-ed egy 1024 folotti porton fut localhoston (mert az alatta levo portokhoz root jog kell, es onnantol bonyolult lesz), es elotte pl. egy nginx proxyzik. Megcsinalhatod ugy is, hogy a NodeJS figyel a 80-as porton, majd usert valt, de altalaban egyszerubb, ha ezt nem kell elkovetni, raadasul igy tobb NodeJS alkalmazast is futtathatsz egymastol fuggetlenul.
8

Ja néztem én is, hogy gondok

inf · 2016. Feb. 24. (Sze), 18.04
Ja néztem én is, hogy gondok vannak ezzel. Elvileg az authbind megoldja http://manpages.ubuntu.com/manpages/precise/man1/authbind.1.html

Igazából nekem nem számít az se, ha nem 80-as porton van, úgyis könyvjelzőbe teszem majd az oldalt vagy kezdőlapra. Szóval nálam ez nem szempont, másnak meg nem tervezem üzemeltetni az oldalát, ahol fontos lenne, hogy ne kelljen portot írni. Gondolkodtam rajta, hogy veszek saját domain-t meg esetleg statikus IP-t, de pénzkidobás lenne. Elég a dinamikus IP valami noip domain névvel, nem üzleti célra lesz. Az nginx-nek van még más előnye? Elsősorban biztonsági szempontból érdekelne. A nagyobb teljesítmény statikus kiszolgálásban nálam most szintén nem szempont. Olyasmiket írtak, hogy ddos ellen véd valamennyire, de mivel úgyis szeretnék fail2ban-t vagy ilyesmit használni, ezért talán ez sem szempont. Talán még erre se lesz szükségem, ha VPN mögé teszem az egészet, és úgy csatlakozok rá. Legalábbis azt mondják, hogy az kb olyasmi, mintha belső hálóra csatlakoznék. Az az egy baja van, hogy bonyolult, én meg lusta vagyok. xD
16

nginx

janoszen · 2016. Feb. 24. (Sze), 22.44
Izles kerdese. Egy olyan szoftver, ami elsodlegesen webszervernek van kitalalva, adott esetben meg tud fogni par olyan tamadast, amire egy NodeJS-ben nem biztos, hogy gondoltak. Meg mint mondottam, konyebb boviteni ha no a NodeJS alkalmazasok szama.
17

Egy olyan szoftver, ami

inf · 2016. Feb. 25. (Cs), 08.23
Egy olyan szoftver, ami elsodlegesen webszervernek van kitalalva, adott esetben meg tud fogni par olyan tamadast, amire egy NodeJS-ben nem biztos, hogy gondoltak.


Konkrétan ez a része érdekelne egy kicsit kibontva. Nálam az nginx-et egyedül a biztonság indokolná, nincsenek terhelésből fakadó problémáim, és ezen a szerveren nem is lesznek. Próbálok utánakeresni, hátha találok valamit.

szerk:
Közben próbáltam utánanézni ennek a reverse proxy témának. Talán érdekes lehet, hogy nodejs-ben is írtak jópárat. Ez kapta a legtöbb csillagot: https://github.com/OptimalBits/redbird. Összehasonlító teszteket nem láttam nginx-el, de nyugodtan nevezhetjük ezt is célszoftvernek, és akkor ugyanott vagyunk.

Maga a nodejs egyébként valóban nem szervernek készült, az express (és társai) viszont igen. Szóval ha össze akarunk hasonlítani valamit, akkor az express-t és/vagy a redbird-öt lehetne az nginx-el, és nem a nodejs-t.
20

Maga a nodejs egyébként

Joó Ádám · 2016. Feb. 25. (Cs), 14.15
Maga a nodejs egyébként valóban nem szervernek készült, az express (és társai) viszont igen. Szóval ha össze akarunk hasonlítani valamit, akkor az express-t és/vagy a redbird-öt lehetne az nginx-el, és nem a nodejs-t.


A HTTP implementáció a Node része, nem?
23

Igaz, benéztem.

inf · 2016. Feb. 25. (Cs), 17.23
Igaz, benéztem.
9

Ahogy nézem, a pm2 úgy van

MadBence · 2016. Feb. 24. (Sze), 18.15
Ahogy nézem, a pm2 úgy van megcsinálva, hogy userenként fusson. Tehát ne rootként futtasd a process managert :).

Mi egyébként most supervisord-t használunk (régebben pedig monit-ot), minden service saját userként fut, lokális node-ja van minden servicenek (nvm-mel, tehát minden service olyan verzión futhat, amilyen verzión szeretne), az egész előtt egy nginx proxy (és aminek kívülről is látszania kell, az látszik kívülről is). Az egész gombóc ansible-lel van deployolva, így a konfiguráció is egy helyen van (jelszavak, stb), így a forráskódban sehol sincsenek érzékeny adatok. Kb. az az architektúra, amit janoszen is felvázolt egyébként.
13

Hát én konkrétan így

inf · 2016. Feb. 24. (Sze), 19.24
Hát én konkrétan így telepítettem, ez gondolom rendszer szintűnek számít:

	curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -
	apt-get install nodejs
A pm2-vel az van, hogy magától indul rendszer indításkor. Ádám elmondása alapján ezek szerint startup indítja, úgyhogy gondolom megkéne keresnem a startup scriptjét, és azon beállítani, hogy milyen felhasználóval indítsa. Én csak pár hónapja Linux-ozom, és nem világos, hogy az ilyen automatikusan induló alkalmazások milyen user jogköreivel indulnak, esetleg hogyan lehet korlátozni a hozzáférésüket a rendszer bizonyos részeihez. Az sem tiszta, hogyha az alkalmazás fájljait felhasználókhoz kötöm, akkor az mit segít rajtam. Esetleg nincs valami rövid összefoglalótok arról, hogy hogyan mennek ezek a dolgok a Linux-nál, hogy képben legyek? Egyre inkább az a kérdésem, hogy a hiányzó alapok miatt még azt sem tudom megfogalmazni, hogy mit akarok kérdezni. :D

és aminek kívülről is látszania kell, az látszik kívülről is

Ezt nem lehet elérni a tűzfalon port nyitással, port forward-al? Minek kell erre plusz egy nginx? Azt látom én is, hogy sokan node + nginx felállást választják, de továbbra sem értem, hogy ez miért annyival előnyösebb, mint node-ot csak magában futtatni, illetve, hogy erre nekem szükségem van e egy itthoni alkalmazásnál, amit csak én használok, nagyon esetleg részleteket, pl blogot megosztok másokkal is egy dyndns-es weboldalon.
15

Az sem tiszta, hogyha az

Joó Ádám · 2016. Feb. 24. (Sze), 19.35
Az sem tiszta, hogyha az alkalmazás fájljait felhasználókhoz kötöm, akkor az mit segít rajtam.


Ennek leginkább az az értelme, hogy ha valamelyik alkalmazásban hiba van, akkor minél kevesebb joggal rendelkezik, annál kisebb lehet az okozott kár.
18

Jól sejtem, hogy a take

inf · 2016. Feb. 25. (Cs), 08.38
Jól sejtem, hogy a take ownership-el lehet ezt elérni. Szóval ha executable flag van a fájlon, és az ownership x felhasználójé, akkor ha futtatom a fájlt y felhasználóval, akkor x vagy y felhasználói jogaival fog rendelkezni a futó alkalmazás, vagy esetleg valami mással?

Abból kiindulva, hogy a root-ként futtatás mennyire veszélyes, gyanítom, hogy y felhasználó jogait kapja majd, viszont akkor nem értem, hogy az ownership mire való. Talán arra, hogy más ne nézhesse meg a te fájljaidat? :D Az a része továbbra sem világos, hogy akkor most az init script indítók root jogosultsággal indulnak, és utána ezt használják fel, hogy különböző felhasználók nevében futtassanak alkalmazásokat? Szóval ha y felhasználó beregisztrál egy init scriptet, akkor az init script indító y nevében fogja mondjuk reboot-nál elindítani a scriptet? Ugyanez igaz a process manager-ekre, mint pl a pm2?
21

Az a része továbbra sem

Joó Ádám · 2016. Feb. 25. (Cs), 14.21
Az a része továbbra sem világos, hogy akkor most az init script indítók root jogosultsággal indulnak, és utána ezt használják fel, hogy különböző felhasználók nevében futtassanak alkalmazásokat?


Igen, az init rootként fut, te pedig megmondhatod, hogy milyen felhasználóként indítsa el a rábízott folyamatokat.

A fájljogosultságok rendszerét érted?
24

Az attól függ, hogy az mi :D

inf · 2016. Feb. 25. (Cs), 17.24
Az attól függ, hogy az mi :D
25

Mivel Unixon a fájlrendszer

Joó Ádám · 2016. Feb. 25. (Cs), 17.59
Mivel Unixon a fájlrendszer reprezentálja szinte a teljes környezetet, ezért a felhasználói jogosultságokat is a fájlokon keresztül állítod be. A fájlrendszer minden eleméhez rendelhetsz egy felhasználót és egy csoportot, és megadhatod, hogy ezek, illetve mindenki más milyen jogokkal rendelkeznek felette. Minden futó folyamat egy felhasználóhoz van rendelve, és csak ahhoz és úgy fér hozzá a fájlrendszerben, és így általában a rendszeren, amihez a fentiek szerint felhatalmazást kapott.
14

Nem ismerem a pm2-t, és nem

Joó Ádám · 2016. Feb. 24. (Sze), 19.30
Nem ismerem a pm2-t, és nem tudom, hogy milyen funkcióit használod, de ránézésre úgy tűnik, hogy nagy átfedés van közte és mondjuk egy systemd közt. Nem biztos, hogy szükséged van rá.
19

Hát nagyjából annyit csinál,

inf · 2016. Feb. 25. (Cs), 08.41
Hát nagyjából annyit csinál, hogy elindítja a nodejs alkalmazásokat, aztán ha elszáll valamelyik process, akkor újraindítja. Mélyebben még nem foglalkoztam vele. Van még a forever, ami ezt tudja, de annál azért több feature van a pm2-ben.
22

Ezt systemd-vel vagy

Joó Ádám · 2016. Feb. 25. (Cs), 14.22
Ezt systemd-vel vagy Upstarttal ki tudod váltani.
26

Újabb adalék ehhez az nginx +

inf · 2016. Már. 1. (K), 12.01
Újabb adalék ehhez az nginx + node dologhoz, hogy nginx mégsem biztos, hogy gyorsabb statikus fájl kiszolgálásban. Legalábbis egy benchmark szerint. Érdemes lenne tesztelni. Itt lehet olvasni róla:

Biztonsági szempontból volt DDOS, amire sebezhető volt, de már évekkel ezelőtt javították. Persze lehetséges, hogy nginx megfog biztonsági hibákat, amik nodejs-re jellemzőek, viszont az is lehetséges, hogy behoz a rendszerbe nginx-re jellemző biztonsági hibákat. Úgyhogy nekem ez sem érv. Ha lesz reverse proxy, akkor nodejitsu vagy redbird féle lesz. Nem szeretnék keverni technológiákat.

Ennek a felhasználós témának még nézek utána. Találtam pár érdekes dolgot a témában, pl itt külön user futtatja a nodejs processeket meg a pm2-t is: https://nodeswat.com/blog/setting-up-a-secure-node-js-web-application/. Nem tetszik a megoldás, mert systemd-t használ a felhasználó beállítására a pm2 helyett, de legalább látszik, hogy lehetséges a dolog.