IT Blog

Wyświetlone 1-6 z 6 rekordów.

Ubuntu 18.04 LTS kernel 4.15.0-60-generic

Po zaktualizowaniu kernela na ubuntu 18.04 LTS do wersji: 4.15.0-60-generic serwer HP proliant G3 (rok 2006) zawiesza się. Występuje "kernel panic".

(4.15.0-60-generic #67-Ubuntu SMP Thu Aug 22 16:55:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux_)

Rozwiązanie to downgrade kernela do wersji 4.15.0-58-generic czyli:

apt remove linux-image-4.15.0-60-generic

mcedit /boot/grub/menu.lst - usunięcie wpisów -60

upgrade-grub

reboot

rm /boot/vmlinuz-4.15.0-60-generic
rm /boot/initrd.img-4.15.0-60-generic
update-grub

freeradius 3.0 - Eduroam

Na uczelni mamy wdrożoną sieć wifi EDUROAM. Wdrożenie działa w oparciu o oprogramowanie: Ubuntu 18.04LTS, freeradius, LDAP, MySQL, accesspointy z VLANEM i możliwością podania serwera autoryzacji radius. Ponieważ pojawiła się wersja 18.04, a ja miałem 16.04 postanowiłem wykonać uprage systemu operacyjnego.

Przejście z Ubuntu 16.04 to 18.04 wiąże się z aktualizacją Freeradiusa z wersji 2 do 3. Oto kilka problemów, które musiałem rozwiązać aby zaczął prawidłowo działać edruroam z freeradiusen 3.0:

  • pliki konfiguracyjne znajdują się teraz w katalogu /etc/freeradius/3.0/. W wersji 2 były po prostu w /etc/freeradius/, co gorsza po upgradzie ubuntu zostawił stare pliku i katalogi. Trzeba się więc pilnować bo /etc/freeradius/3.0/sites-enabled to nie to samo co /etc/freeradius/sites-enabled - a są oba katalogi
  • w poradniku freeradius3.0 + eduroam ( https://wiki.freeradius.org/guide/eduroam) jest podana konfiguracja z modułem linelog. Po tygodniu działania logów od freeradiusa (du -sh /var/log/freeradius/) było 1.2G!!! Przestawiłem więc zbieranie logów do modułu sql.
  • Instalacja freeradius-mysql nie powiodła się ze względu na niespełnione zależności. Pakiet freeradius-mysql (apt install freeradius-mysql) zwracał że chce freeraiusa w wersji 2.8!
    Ale ja mam zainstalowanego z oficjalniej dystrybucji freeradiusa3.0, więc coś nie tak ze spójnością pakietów? Okazało się, że po upgrade dystrybucji do 18.04 nie zmienił się plik /etc/apt/sources.list - został stary. Podmieniłem go na:
deb http://in.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb http://in.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://in.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb-src http://in.archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb-src http://in.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://in.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe multiverse

potem:

apt update
apt install freeradisu-mysql

Zadziałało ok.

  • Następny problem to zbieranie logów. Okazuje się, że mimo wyłączenia sekcji log zapisywania haseł użytkowników do plików loga w tabeli radpostauth w polu pass zapisuje się podane hasło zawsze dla moich użytkowników (dla użytkowników innych uczelni - proxy - nie). Rozwiązanie to dodanie w site inner-tunnel:
post-auth {
update {
 User-Password := NULL
}
...
}

Wpis ten zmienia User-Password po zalogowaniu się użytkownika a przed wykonaniem wpisu loga w MySQL.

Yii2 kolejka maili

Problem:

Kiedy dodajemy ogłoszenie dla studentów, wybieramy grupę studentów. Zdarza się, że liczba wybranych jest powyżej 2000-2500. Wtedy, mimo dużego timeout'u wykonywania skryptu, serwer zwróci do przeglądarki przekroczenie czasu wykonywania. Poza tym użytkownik musi czekać bez ządnych komunikatów na odpowiedź serwera - powstaje wrażenie, że "coś się zawiesiło"

yii2 mailer queue

Mechanizm kolejkowania składa się z serwisu CRON oraz kodu PHP dającego dostęp do zarządzania tzw. jobami :)

Instalujemy w yii2 moduł koleiki jopbów i korzystający z niego Mailer:

composer require --prefer-dist shaqman/yii2-queue-mailer
<code>composer require --prefer-dist yiisoft/yii2-queue</code>

Konfiguracja opisana w dokumentacji yiisoft/yii2-queue: https://github.com/yiisoft/yii2-queue mówi nam, że możemy podpiąć bazę danych z otworzoną tabelą dla przechowywania info o zadaniach. Próbowałem użyć MySQL, niestety bezskutecznie. Występował problem z Mutextem:

Exception 'yii\base\InvalidConfigException' with message 'In order to use MysqlMutex connection must be configured to use MySQL database.'

Nie udało mi się tego problemu rozwiązać. Ponieważ na serwerze mam REDIS użyłem konfiguracji w pliku config/web.php:

components' => [
        'redis' => [
            'class' => \yii\redis\Connection::class,
            // ...
            // retry connecting after connection has timed out
            // yiisoft/yii2-redis >=2.0.7 is required for this.
            'retries' => 1,
        ],
        'queue' => [
            'class' => \yii\queue\redis\Queue::class,
            'redis' => 'redis', // Redis connection component or its config
            'channel' => 'queue', // Queue channel key
        ],

mój Mailer jest skonfigurowany tak, że używam serwera SMTP na innym serwerze (nie na tym samy co strona w yii2), konfiguracja dla queuemailer wygląda tak:

  [
    'class' => \shaqman\mailer\queuemailer\Mailer::class,
    'queue' => 'queue',
    'syncMailer' => [ 
        'class' => 'yii\swiftmailer\Mailer',
        'useFileTransport' => false, 
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => '*',
            'username' => '*',
            'password' => '*',
            'port' => '25',
            'encryption' => 'tls',
        ],
    ],
];

Oczywiście * zamienić należy na serwer, login, hasło.

Następny krok to konfiguracja dla polecenia z konsoli. Należy dodać:

  • w bootstrapie wczytywanie queue,
  • w komponentach dodać konfigurację redis i queue.

Zmieniam mój confog/console.php tak:

// ..
<span class="redactor-invisible-space">'bootstrap' => [
        'queue',
        'log',
    ],
// ..</span>
'components' => [
        // ...
        'redis' => [
            'class' => \yii\redis\Connection::class,
            'retries' => 1,
        ],
<span class="redactor-invisible-space">        'queue' => [
            'class' => \yii\queue\redis\Queue::class,
            'redis' => 'redis', // Redis connection component or its config
            'channel' => 'queue', // Queue channel key
        ],</span>
        // ...


Teraz wszytko testuję poleceniem w terminalu na serwerze z Yii2:

/var/www/html/firma/yii queue/info

dostaje wynik:

Jobs
- waiting: 0
- delayed: 0
- reserved: 0
- done: 0

Oznacza to, że wszystko działa OK!

Teraz dodaje do crona polecenie, które uruchamiam co 10 minut jako root. W tym celu dodaje do /etc/crontab:

*/10 * * * * root /var/www/html/firma/yii queue/run


Z oprogramowaniem yii2-mailqueue jest jeden problem: maler->send() zwraca numer zadania dodanego do kolejki zadań a nie true. Należy więc zmienić funkcję Powiadom w modelu Osoba. U mnie wygląda to tak:

public function Powiadom($temat, $tresc, $sms = false, $tresc_sms = false) { 
// ... 
$job_id = Yii::$app->mailer
 ->compose('powiadomienie', ['tresc' => $tresc])
 ->setFrom($email_nadawcy)
 ->setTo($emiale_odbiorcy)
 ->setSubject($temat)
 ->send();
 $message = (is_numeric($job_id)) ? "Dodano email do kolejki wysyłania emaili pod numerem: " . $job_id . PHP_EOL :
 Alert::widget([
 'options' => ['class' => 'alert-danger'],
 'body' => "NIE DODANO WIADOMOŚCI DO KOLEJKI EMAILI!!!"
 ]);
// ...
<span class="redactor-invisible-space">return $message;
    }</span>

Ostateczny test: Maile dochodzą - jest OK :)

uff... trza mi kawy :)

Dziękuję za lekturę

fail2ban

Postanowiłem podrasować konfigurację zabezpieczeń serwera. W tym celu założyłem, że chcę blokować na firewalu atakujących po IP i porcie (używam shorewall). Program fail2ban służyć ma banowaniu atakujących nasz serwer.

W fail2ban można określić:

  • ile razy ma wystąpić log ataku,
  • na jak długo blokować IP
  • jakie polecenie wprowadza reguły do firewall
  • jak informować administratora o blokadach IP

Na serwerze (ubuntu 16) miałem już zainstalowany z ustawieniami domyślnymi fail2ban. Postanowiłem poprawić konfigurację programu fail2ban, tak aby na pewno pilnował moich serwisów.

W tym celu:

  1. Znalazłem w google: https://chasmathis.com/2017/10/28/fail2ban-ubuntu-16-04/
  2. Wykonałem do "Configuring iptables for fail2ban:". Używam shorewall więc to (ręczne iptables) nie pasuje do mojej konfiguracji,
  3. service fail2ban restart - dawał błędy. Nie uruchamiał się. Okazało się, że należy wyłączyć wszytkie nieużywane serwisy przez dodanie: enabled = false
  4. Pliki, które musiałem zmienić to: /etc/fail2ban/jail.local oraz /etc/fail2ban/jail.d/defaults-debian.conf

W pliku /etc/fail2ban/jail.local ustawiłem program shorewall jako zarządzający wpisami w firewallu

banaction = shorewall


W pliku /etc/fail2ban/jail.d/defaults-debian.conf ustawiłem

 enabled = true

dla programów, które mam zainstalowane oraz

enabled = false

dla programów, których nie używam. Poniżej cały kod mojego pliku /etc/fail2ban/jail.d/defaults-debian.conf :

[sshd]
enabled = true
[openwebmail]
enabled = false
[horde]
enabled = false
[groupoffice]
enabled = false
[sogo-auth]
enabled = false
[tine20]
enabled = false
[drupal-auth]
enabled = false
[guacamole]
enabled = false
[monit]
enabled = false
[webmin-auth]
enabled = false
[froxlor-auth]
enabled = false
[squid]
enabled = false
[3proxy]
enabled = false
[proftpd]
enabled = false
[pure-ftpd]
enabled = false
[gssftpd]
enabled = false
[wuftpd]
enabled = false
[vsftpd]
enabled = false
[assp]
enabled = false
[courier-smtp]
enabled = false
[postfix]
enabled = true
[postfix-rbl]
enabled = true
[sendmail-auth]
enabled = false
[sendmail-reject]
enabled = false
[qmail-rbl]
enabled = false
[dovecot]
enabled = true
[sieve]
enabled = true
[solid-pop3d]
enabled = false
[exim]
enabled = false
[exim-spam]
enabled = false
[kerio]
enabled = false
[courier-auth]
enabled = false
[postfix-sasl]
enabled = true
[perdition]
enabled = false
[squirrelmail]
enabled = false
[cyrus-imap]
enabled = false
[uwimap-auth]
enabled = false
[named-refused]
enabled = false
[nsd]
enabled = false
[asterisk]
enabled  = false
[freeswitch]
enabled  = false
# for syslog (daemon facility)
# [mysqld_safe]
# syslog
#
# for own logfile
# [mysqld]
# log-error=/var/log/mysqld.log
[mysqld-auth]
enabled  = false
[pam-generic]
[xinetd-fail]
enabled  = false
[stunnel]
enabled  = false
[ejabberd-auth]
enabled  = false
[counter-strike]
enabled  = false
[nagios]
enabled  = false
[oracleims]
enabled = false
[directadmin]
enabled = false
[portsentry]
enabled  = false
[pass2allow-ftp]
enabled  = false
<span class="redactor-invisible-space">
</span>


5. Na koniec zostało informowanie admina co jest blokowane. W tym celu w fail2ban mamy ustawienie action:

action_ = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_xarf = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
action_blocklist_de = blocklist_de[email="%(sender)s", service=%(filter)s, apikey="%(blocklist_de_apikey)s"]
action_badips = badips.py[category="%(name)s", banaction="%(banaction)s"]

6. Aby przychodził mail do admina z info banowania ustawiamy:

action = %(action_mwl)s

Przy powyższym ustawieniu action po minucie miałem kilkadziesiąt maili. Wystarczy więc że banowani będą zapisywani w logu fail2ban. Przestawiłem więc action na:

action = %(action_)s


7. Na koniec warto zaglądnąć do logów:

tail -f /var/log/fail2ban.log 
2018-09-25 09:59:29,843 fail2ban.filter [28210]: INFO [pam-generic] Found 210.75.202.138
2018-09-25 10:00:20,632 fail2ban.filter [28210]: INFO [sshd] Found 115.231.221.167
2018-09-25 10:00:20,644 fail2ban.filter [28210]: INFO [pam-generic] Found 115.231.221.167
2018-09-25 10:00:20,646 fail2ban.filter [28210]: INFO [sshd] Found 115.231.221.167
2018-09-25 10:00:22,475 fail2ban.filter [28210]: INFO [sshd] Found 115.231.221.167
2018-09-25 10:01:19,226 fail2ban.filter [28210]: INFO [sshd] Found 181.143.23.42
2018-09-25 10:01:19,242 fail2ban.filter [28210]: INFO [pam-generic] Found 181.143.23.42
2018-09-25 10:01:19,245 fail2ban.filter [28210]: INFO [sshd] Found 181.143.23.42
2018-09-25 10:01:21,504 fail2ban.filter [28210]: INFO [sshd] Found 181.143.23.42
2018-09-25 10:01:52,247 fail2ban.filter [28210]: INFO [pam-generic] Found 60.174.118.80


Banowanie działa!

Można jeszcze zobaczyć co się dziele w firewalu:

shorewall show |grep f2b

da nam nazwy grup dodanych przez fail2ban do shorewalla. Mam:

 193K 55M f2b-pam-generic tcp -- * * 0.0.0.0/0 0.0.0.0/0 
193K 55M f2b-recidive tcp -- * * 0.0.0.0/0 0.0.0.0/0

Tak więc lista reguł pokaże się po komendzie:

show f2b-pam-generic

lub

shorewall show f2b-recidive


Dziękuję za lekturę, mam nadzieję że się to komuś przyda, przepraszam za błędy językowe.stylistyczne/gramatyczne. Idę na kawę :)

Nowa strona YII

Dziś opublikowałem nową stronę marcinmisiak.pl.

W zakładce Blog IT zamierzam publikować moje potyczki z komputeryzacją miast i wsi :)

W planach mam:

  • komentarze - dodawanie komentarzy do wpisów blogu
  • raiting stars

Poprawny nr konta bankowego

Na stronie http://phpedia.pl/wiki/Walidacja_numeru_NRB można zobaczyć przykład walidacji w PHP nr konta bankowego. Na tej podstawie zrobiłem dziś walidator w modelu Yii2:

class ZlecenieOsoba extends ActiveRecord {

...

public function rules() {
return [
...
[['nr_konta_bankowego'], 'sprawdzNumerNRB'],
];
}
...

public function sprawdzNumerNRB($attribute, $params, $validator) {
// Usuniecie spacji
$iNRB = str_replace(' ', '', $this->$attribute);
// Sprawdzenie czy przekazany numer zawiera 26 znaków
if (strlen($iNRB) != 26) {
$this->addError($attribute, 'Nr konta musi mieć 26 cyfr' . ' wpisano: ' . strlen($iNRB) . ' cyfr');
return false;
}


// Zdefiniowanie tablicy z wagami poszczególnych cyfr
$aWagiCyfr = array(1, 10, 3, 30, 9, 90, 27, 76, 81, 34, 49, 5, 50, 15, 53, 45, 62, 38, 89, 17, 73, 51, 25, 56, 75, 71, 31, 19, 93, 57);


// Dodanie kodu kraju (w tym przypadku dodajemy kod PL)
$iNRB = $iNRB . '2521';
$iNRB = substr($iNRB, 2) . substr($iNRB, 0, 2);


// Wyzerowanie zmiennej
$iSumaCyfr = 0;


// Pętla obliczająca sumć cyfr w numerze konta
for ($i = 0; $i < 30; $i++) {
$iSumaCyfr += $iNRB[29 - $i] * $aWagiCyfr[$i];
}
// Sprawdzenie czy modulo z sumy wag poszczegolnych cyfr jest rowne 1
if ($iSumaCyfr % 97 !== 1) {
$this->addError($attribute, 'Nieprawidłowy nr konta bankowego. (tylko polskie banki)');
}
}