Securing apache

Ha esélyt szeretnénk adni Apache szerverünknek az életre, érdemes az alap beállításokon módosítani pár dolgot.

A legfontosabb szabály, a szerverünk mindig legyen naprakész (apt update, apt upgrade, esetleg a paranoiásaknak chkrootkit)

Aztán érdemes meggyőzni az Apache-ot, hogy ne mondja el mindenkinek a verziószámát, így talán nehezebb lesz expolit-ot keresni benne:

ServerSignature Off
ServerTokens Prod

A második a mod_security. Ezt sajnos kicsit macerásabb beállítani, de megéri. Ehhez az alábbi lépésekre van szükség:

apt-get install libapache2-mod-security2
cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Ezután érdemes bekapcsolni a security használatát az újonnan létrehozott (modsecurity.conf) konfig fájlban (alapból csak detektálásra van állítva)

SecRuleEngine On

Ha ez megvan, már nincs másra szükségünk, csak friss biztonsági szabályokra (persze csak egy gyors backup után).

mv /usr/share/modsecurity-crs /usr/share/modsecurity-crs.bak
git clone https://github.com/coreruleset/coreruleset.git /usr/share/modsecurity-crs

Majd ezt lehet frissítgetni időnként az alábbi paranccsal:

cd /usr/share/modsecurity-crs
git pull

Ezután még példányosítani kell a configot:

cp /usr/share/modsecurity-crs/crs-setup.conf.example /usr/share/modsecurity-crs/crs-setup.conf

Ha ez megvan, és a szerveren futtatunk valamilyen speciális dolgot (Pl. WordPress) akkor érdemes azt kivételként megadni. Az új configunkban (crs-setup.conf) az alábbi sorokat kell kicommentelni, és a megfelelő rendszerhez 1-est írni:

 SecAction \
  "id:900130,\
   phase:1,\
   nolog,\
   pass,\
   t:none,\
   setvar:tx.crs_exclusions_cpanel=0,\
   setvar:tx.crs_exclusions_dokuwiki=0,\
   setvar:tx.crs_exclusions_drupal=0,\
   setvar:tx.crs_exclusions_nextcloud=0,\
   setvar:tx.crs_exclusions_phpbb=0,\
   setvar:tx.crs_exclusions_wordpress=1,\
   setvar:tx.crs_exclusions_xenforo=0"

És már meg is tettük az első lépéseket egy biztonságosabb Apache szerver felé.

Sose feledjétek: biztonságos rendszer nincs, max. biztonságosabb…

JDK on Ubuntu

A Java telepítés nem egy nagy varázslat. Rendszerint arról szól, hogy kitömörítjük valahova a fájlokat, és elérjük, hogy amikor beírjuk hogy java, akkor az általunk kitömörített cucc induljon el.

Ez windows alatt egy download, total commander, és a PATH környezeti változó módosításával elérhető.

Ubuntu alatt főként csak terminált használok, szóval beírtam a google-be, hogy jdk install ubuntu, és vadabbnál vadabb dolgokat láttam, és nagyjából semmi se működött. Szóval ha valaki jdk-t szeretne telepíteni ubuntura, akkor az alábbit kell tenni:

Ellátogatni az OpenJdk oldalára, és kimásolni a nekünk tetsző JDK csomag URL-jét

Letölteni a kívánt csomagot:

wget https://download.java.net/java/GA/jdk15.0.1/51f4f36ad4ef43e39d0dfdbaf6549e32/9/GPL/openjdk-15.0.1_linux-x64_bin.tar.gz

Ki kell tömöríteni a cuccot amit letöltöttünk:

sudo tar -xvf openjdk-15.0.1_linux-x64_bin.tar.gz -C /usr/lib/jvm/

Fel kell venni az újonnan létrehozott JDK-a az alternatives közé:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-15.0.1/bin/java 1151

Utána pedig beállíthatjuk a használni kívánt java verziót az alábbi paranccsal:

sudo update-alternatives --config java

Netflix magyar content

A netflix már egy ideje hivatalosan is elérhető Magyarországon. Aztán lokalizálták a honlapot is magyarra, és az utóbbi időben elszaporodtak a magyar feliratok, és ami meglepett a magyar szinkronos filmek is. Bár ezekre az embedded app-okon belül nem nagyon lehet keresni, és a webes felületen se triviális, az alábbi linket megnyitva szépen le lehet szűrni a magyar nyelvű contentet:

https://www.netflix.com/browse/audio

Spotify számcímek a lejátszási listákból

Ha valaki ki szeretné másolni a spotify playlist-ből az előadók és számok címeit, akkor az alábbi javascript kóddal érdemes próbálkozni:

var tracks = document.getElementsByClassName("track-name-wrapper");
for(var i = 0; i < tracks.length; i++)
{
   var trackTitle = tracks[i].getElementsByClassName("tracklist-name")[0].innerHTML;
   var trackArtist = tracks[i].getElementsByClassName("tracklist-row__artist-name-link")[0].innerHTML;
   console.log(trackArtist + " - " + trackTitle);
}

EXCEL LastIndexOf

Ilyen valamiért nincs, pedig néha hasznos lenne. Gondoltam írok egyet, mert miért ne, úgy is rég visual basic-eztem:

Function LastIndexOf(src As Range, char As String)
Dim value As String
Dim valueLen As Integer

value = src.Cells(1, 1).value
valueLen = Len(value)

For i = valueLen To 1 Step -1
If Mid(value, i - 1, 1) = Left(char, 1) Then
 LastIndexOf = i
 Exit Function
End If
Next i
End Function

Használni így kell: =LastIndexOf(A1; “d”)

Windows és a fájlnevek

Azt hittem a “hosszú” fájlnevek problémája csak az emlékeimben él, és a minket követő generációk számára ez a fogalom (akárcsak a ~1 végű fájlok) ismeretlen lesz. Úgy tűnik a Windows ezt másképp gondolja, Ő még őrzi a régi hagyományokat:

Én tényleg nem tudom ki, és mit üzemeltet windows alatt, de minden tiszteletem az övé…

Céges karácsony

Nem titok, hogy az IT területen mozgó emberek a legtöbb céges eseményt kicsit másképp élik meg, mint más területen dolgozó kollégáik. Nem kivétel ez alól a céges karácsony sem. Az általános IT-s karácsony élményt vau tökéletesen összefoglalta, a céges karácsonyi buli című írásában.

Mivel abban a szerencsés helyzetben vagyunk, hogy nálunk szinte mindenki az IT területen dolgozik, adott volt a lehetőség, hogy olyan karácsonyi bulit szervezzünk, ami nekünk IT-soknak tetszik. A  játszunk számítógépes játékkal alapvetést nem akartam én kijátszani, mégiscsak játékfejlesztésből kerültem a vállalati szektorba, és a világért sem szerettem volna a saját érdeklődési körömet ráerőltetni másokra. Szerencsére más irányból is felmerült ez az ötlet, és ha már így alakult nem is volt kérdés, hogy belevágjunk a projektbe.

A döntés megszületése után az első problémát maga a játék kiválasztása jelentette. Skill-t követelő  játék nem nagyon jött szóba, hiszen mind játéktapasztalatban, mind korban nagyon nagy volt a szórás.

Végül a választás a Bomberman ’93 nevű klasszikusra esett. Az irányítása egyszerű, bármin elfut, és lehet egyszerre 4-en játszani.

Hogy senki ne tegyen jelentős előnyre szert, magát a játékot egészen a kezdésig titokban tartottuk. A játék, irányítás bemutatására készült egy rövid prezetnáció, de aki ezt mellőzni szeretné, használhatja az eredeti kézikönyvet is:

A fordulókat kétfős csapatokkal játszottuk, melyek kialakítása során az volt a feltétel, hogy a csapattársnak egy másik területről kell jönnie. Ez okozott némi kavarodást, de abban bíztam, hogy ezáltal nem lesznek túl erős csapatok, hiszen a csapattársak kevésbé ismerik egymást, és a cégen belül is felpezsdül a területek közötti kommunikáció. A csapatok kialakítására egy egyszerű Google Sheets-et használtam. A szükséges ellenőrzési logikát (validateTeamData) pedig megírtam  gscript-ben. Nem lett hibátlan, de a célnak tökéletesen megfelelt.

Mivel a játék turbografx-16-on jelent meg, így a választott emulátor a mednafen lett, retroarch alól futtatva. Még meg kellett oldani az irányítást, amire eredetileg usb-s nes controllereket szerettem volna beszerezni, de a létszámra, és az idő rövidségére való tekintettel ezt végül elvetettem. Maradt az 1 gép, 1 monitor, 2 billentyűzet felállás, billentyűzetenként két játékossal.

A billentyűzetek controllerként viselkedjenek két dologra volt szükség: a vJoy-ra ami mint neve is mutatja virtuális joystick vezérlőket gyárt, és a Virtual Controller-re, amivel a virtuális joystick-okat a billentyűzetek bemenetével lehet etetni.

Szerencsére az egyszerű vezérlés miatt (4 irány 1 gomb) a vJoy beállítások nem lettek valami túl bonyolultak:

A Virtual Controller kapcsán már kicsit összetettebb a dolog:

  • A billentyűzet kezelést át kell állítani Raw módra, hogy a 2 billentyűzet ne akadjon össze (Options – IO Devices – Input – Keyboard Settings – API: RAW Input)
  • Engedélyezni kell a vJoy támogatást, hogy a cél eszköz lehessen a vJoy (Options – IO Devices – Output – vJoy Settings – Enabled: true)
  • Meg kell csinálni a mapping-eket a Controls menüpont alatt, a Quick Binding menü segítségével. Ez nekem nem működött tökéletesen, de jó alapot adott, hogy mit is kellene összerakni kézzel. A végleges fájl letölthető innen: bomberman.bnd

A kész beállítások tesztelhetők a Monitor vJoy alkalmazással:

Sajnos a RetroArch konfigurálás nem volt olyan egyszerű mint elsőre gondotlam, ugyanis else if van a retroarch binding kódjában. Tehát ha kapott billentyűzet inputot, akkor már nem nézte a joystick inputot. A megoldás végülis az lett, hogy készítettem egy mapping-et a Virtual Controllerben Xbox 360 controllerhez vJoy-ra, ezzel már tudtam menteni a vJoy beállításokat a RetroArch-ba. Még 3x megismételni a beállítást nem sok kedvem volt, ezért a többi játékos esetén már kézzel szerkesztettem a config-ot a retroarch.cfg-be. Ezen felül törölni kellett minden bind-ot (az F1 és az ENTER kivételével),  hogy a véletlen mellégépelésekből ne legyen probléma.

A Windows kapcsán a szokásos “gamer” beálllításokat kellett megtenni:

  • Power Options – High performance profile
  • Power Options – Ne kapcsolja ki a gépet / monitort / merevlemezt
  • Intel HD – Disable Hotkeys
  • Disable Sticky keys

A csapatok állását a challonge.com-on vezettem, kicsit aggódtam is, mi lesz ha lehal a szerver, de szerencsére nem halt le.

A döntőt streamelni szerettük volna kommentátorokkal, de végül ez technikai okok miatt nem sikerült.

Persze mint minden ilyen rendezvénynél, itt is voltak technikai problémák, és olyan dolgok, amiket lehetett volna jobban csinálni. Iyenek pl.:

  • A billentyűzetekre lehetett volna nyomtatni színes matricákat, amik mutatják, hogy melyik helyről melyik játékost irányítjuk
  • Jól jött volna egy a csapatokról, és csapattagorkról készített fényképes tabló, hogy ha épp kerestünk egy csapatot vagy tagjait, akkor gyorsabban megtaláljuk
  • Streamelni vagy dedikált capture card-al, vagy arra alkalmas hw támogatással lehet (ShadowPlay / ReLive). Az OBS software streaming használhatatlan (belassult / begagyott tőle az emulátor)
  • Mindent a saját letesztelt infrastruktúrával kell megoldani.  Pl. építettem az iroda wifi-jére, de arra nem számítottam, hogy az ipad amin a pontokat rögzítettem nem fogja túlzottan kedvelni azt.
  • A windows update-t is érdemes kikapcsolni, mert az egyik gép az esemény előtt 3 órával internet kapcsolat nélkül rájött, hogy 160 frissítést fel szeretne telepíteni,  amibe aztán belebukott, aztán megpróbálta a módosításokat visszavonni…

Az esemény a malőrök ellenére úgy gondolom jól sikerült, legalábbis elég sok pozitív visszajelzés érkezett. Örültem, hogy olyan menő kollégáim vannak, akik kortól / nemtől függetlenül ezt az egészet bevállalták. Szívbemarkoló volt a pillanat, mikor még a szabad játék alatt minden gép előtt ültek,  és akik nem fértek oda a váluk fölött nézték, hogy ki hogy játszik, elemezték hogy mi a jó taktika. Tisztára mint egy retro számítógépes klubban.

Már csak ezért is megérte. No meg az érmekért…

(Mellesleg az éremmel sokat szívtam, mert a rajta látható képet nem volt egyszerű megtalálni… Az eredetit végül itt leltem fel, amiről még az izzadságcsepepket is le kellett varázsolni 🙂 )

PID alapú fűtésvezérlés

Azt hittem, nagyon már nem fogok hozzányúlni a fűtéshez. Aztán véletlenül beleolvastam egy mézeskút (Honeywell) termosztát leírásába, ahol arról áradoztak, hogy annyira de annyira takarékos, és annyira menő, mert PI vezérlést használ, ami a legszuperebb.

Mivel én is menő és takarékos termosztátot szerettem volna, kicsit utána olvastam a dolgonak, és rá is találtam a  Proportional Integral Derivative Control-ra, ami nem annyira bonyolult, mint amilyennek elsőre tűnik. Mint a neve is mutatja, derivál, integrál, ebből kitalálja (megjósolja), hogy mikor és mennyit kell fűteni, így nagyon precízen tudja tartani a beállított hőmérsékletet. Nagyjából így:

Akit érdekelnek a további részletek, az itt talál egy egész jó leírást, forráskódot, és további problémafelvetéseket (mint pl. tuning, derivative kick / filter, anti reset windup):

https://apmonitor.com/pdc/index.php/Main/ProportionalIntegralDerivative

A dolog annyira működik, hogy a bevezetés után az első visszajelzés az volt, hogy csináljam vissza az egészet, mert soha nem melegek igazán a radiátorok. Még különösebb tuningolás és különösebb görbeillesztések nélkül is, normál működés során elég észrevehetetlen mikor fűt, és mikor nem. Viszont a tényleges hőmérséklet tized foknál többel nem nagyon tér el az előre beállított értéktől.

A vezérlést egyébként épp a napokban módosítottam tovább, hogy a lenti részt csak akkor fűtse a rendszer ha a fentit amúgy is fűtené. Így önmagában a lenti ág csak végszükség esetén indul el, és sokkal melegebb is van, mintha külön fűteném. A fűtés hatásfoka nem észrevehető módon romlott (a plusz egy radiátor és padlófűtés cső nem sokat vesz el a visszatérő ágból, amit amúgy is felfűt a kazán).

A jövőben ha lesz még egy kis időm, akkor az újonnan érkezett szervómotorokból egyet rákötök a kazán hőmérséklet állító tekerőjére, és megpróbálom kihasználni a D részt a PID vezérlőből. Így majd az eltérés mértéke vezérli a kazán által előállított és keringetett víz hőmérsékletét. Ha csak picit kell fűteni, akkor az majd alacsony hőfokú (pl. 40 fokos) vízzel történik, ha nagyon, akkor pedig melegebb (pl. 60 fokos) vízzel.

A kapcsolódó kódok pedig a szokott helyen, a github-on.

Smarthome@github

Amikor nekiálltam az építsünk okos házat projektnek, arra gondoltam, hogy az átlagos informatikai projektektől eltérően ez egy egyszerű dolog lesz, buktatók és problémák nélkül, pár hét alatt véget is ér. Annyira bíztam ebben, hogy még repository-t se csináltam, a forrásokat egyszerűen dropbox-on tartottam. Mostanra eljutottam oda, hogy az alapvetések már működnek, és újra se kell írni mindent (amíg nem jön az openhab v3). Igaz az ütemezéssel kicsit megcsúsztam, de hát mégicsak egy IT projektről van szó, ahol még azok sem mindig tudják mit akarnak, akik az általam használt komponenseket fejlesztik…

Jelenleg épp léptető motort programozok, 3D modelleket készítek nyomtatáshoz, integrálok, deriválok, szabadidőmben pedig egy megbízhatóbb MQTT kommunikációs protokol implementációján gondolkozom, az eszközök és az openhab között… Szóval az izgalmak még csak most kezdődnek (legalábbis annyi izgalom, amit az időm enged).

Újdonság viszont, hogy a projekt felkerült a github-ra, így az újabb dolgok már ott is megtalálhatók: https://github.com/voji/smarthome