Dodawanie nowego certyfikatu SSL.

W artykule przedstawiono jak utworzyć nowy certyfikat Apache Web Server Self-Signed Certificate używając narzędzi openssl.

openssl_logoPROCEDURA

  1. Sprawdź datę wygaśnięcia istniejącego certyfikatu jeżeli go posiadasz new.crt używając następującego polecenia:
    > openssl x509 -in new.crt -noout -enddate
    notAfter=Dec 30 11:10:42 2013 GMT
  2. Wygeneruj nowy certyfikat używając polecenia new.key do tworzenia prywatnego certyfikatu.
    > openssl req -new -key new.key -out new.csr

    Jeżeli potrzebujesz klucza 2048 bitowego RSA (prywatnego) dla użyj:

    > openssl genrsa -out new.key 2048

    Zauważ: flaga –des3  może zostać użyta jeżeli nie chcesz ochrony hasłem swojego klucza.

    Sprawdź teraz informacje o kluczu:

    > openssl req -in new.csr -noout -text
    Certificate Request:
     Data:
     Version: 0 (0x0)
     Subject: C=PL, ST=SL, L=Sosnowiec, O=Artmetic, OU=Master, CN=Artmetic/emailAddress=artmetic@artmetic.pl
     Subject Public Key Info:
     Public Key Algorithm: rsaEncryption
     Public-Key: (4096 bit)
     Modulus:
     00:cd:41:ec:df:20:66:44:05:1e:fb:f9:a5:cc:7a:
     c8:5b:14:d0:0f:5b:01:aa:39:1c:64:f7:f0:6b:dd:
     2e:7f:35:fd:50:24:c4:51:9a:69:88:92:78:59:4a:
     dd:9f:aa:c5:de:57:7e:58:84:fe:ab:68:11:cb:71:
     b1:11:6f:2b:71:9e:e6:2d:75:05:84:ff:6e:b1:d6:
     a0:28:25:19:f2:a7:1c:62:f7:61:09:dc:fc:45:5f:
     8b:95:d7:2c:10:69:f7:e4:dd:6a:ee:ea:d0:25:ea:
     8b:a8:95:0f:8f:87:13:9a:8b:68:c4:98:9e:17:a6:
     68:e5:d8:d6:73:39:d3:b5:81:49:65:3f:d2:29:c2:
     a1:29:a4:ad:3a:d1:24:93:8f:12:aa:ea:a6:61:56:
     d3:5a:03:a5:63:1a:89:50:ac:fa:a9:a3:4d:09:c0:
    .........
  3. Wygeneruj nowy klucz na kolejne 365 dni.
    > openssl x509 -req -days 365 -in ssl/new.csr -signkey ssl/testingcert.key -out ssl/new.crt
  4. Utwórz new.pem dla klucza new.key.
    > cp new.key new.pem
  5. Dopisz do pliku new.pem zawartość pliku new.crt.
    >  cat new.crt >> ./new.pem
  6. Zweryfikuj nowo utworzny certyfikat.
    > openssl verify ssl/new.crt
    new.crt: C = PL, ST = SL, L = Sosnowiec, O = Artmetic, OU = Programmer, CN = Artmetic, emailAddress = artmetic@artmetic.pl
    error 18 at 0 depth lookup:self signed certificate
    OK
    
    

    Zbinduj certyfikat new.pem z portem4567.

    > openssl s_server -cert new.pem -www -accept 4567 
    Using default temp DH parameters
    ACCEPT
    

    Sprawdź jak certyfikat wyświetla się po połączeniu z portem. Jeżeli nie działa sprawdź firewall.

    >  openssl s_client -connect localhost:4567
    CONNECTED(00000003)
    depth=0 C = PL, ST = SL, L = Sosnowiec, O = Artmetic, OU = Programmer, CN = Artmetic, emailAddress = artmetic@artmetic.pl
    verify error:num=18:self signed certificate
    verify return:1
    depth=0 C = PL, ST = SL, L = Sosnowiec, O = Artmetic, OU = Programmer, CN = Artmetic, emailAddress = artmetic@artmetic.pl
    verify return:1
    ---
    Certificate chain
     0 s:/C=PL/ST=SL/L=Sosnowiec/O=Artmetic/OU=Programmer/CN=Artmetic/emailAddress=artmetic@artmetic.pl
     i:/C=PL/ST=SL/L=Sosnowiec/O=Artmetic/OU=Programmer/CN=Artmetic/emailAddress=artmetic@artmetic.pl
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    MIIDmjCCAoICCQCNFJcrFLsz8DANBgkqhkiG9w0BAQsFADCBjjELMAkGA1UEBhMC
    A1UEBhMCY2ExEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
    IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKOZIhvcNAQEBBQADggEPADCCAQoCggEB
    AMY9YCGsqII2jPAbmPskM2hgFKDBfb6LRMOBAu4dHtQiWm5ntO3exLG67HC+kVoH
    0J2HX+nnDi6bbsh244vh7KkpM9rgxkybAyOYYNnDZoiW+87DLxkAR041tX8Vl2yk
    ...

Jak odnaleźć zależne biblioteki współdzielone.

Biblioteki współdzielone mogą być odnalezione poprzez wydanie polecenia:

 ldd nazwaAplikacji

Jednak gdy chcemy odnaleść wszystkie biblioteki zależne, które potrzebne są do odpalenia aplikacji skompilowanej dynamicznie możemy posłużyć się poniższym skryptem:

#!/bin/bash
# Author : Hemanth.HM
# Email : hemanth[dot]hm[at]gmail[dot]com
# License : GNU GPLv3
#

function useage()
{
    cat << EOU
Useage: bash $0 <path to the binary> <path to copy the dependencies>
EOU
exit 1
}

#Validate the inputs
[[ $# < 2 ]] && useage

#Check if the paths are vaild
[[ ! -e $1 ]] && echo "Not a vaild input $1" && exit 1
[[ -d $2 ]] || echo "No such directory $2 creating..."&& mkdir -p "$2"

#Get the library dependencies
echo "Collecting the shared library dependencies for $1..."
deps=$(ldd $1 | awk 'BEGIN{ORS=" "}$1\
~/^\//{print $1}$3~/^\//{print $3}'\
 | sed 's/,$/\n/')
echo "Copying the dependencies to $2"

#Copy the deps
for dep in $deps
do
    echo "Copying $dep to $2"
    cp "$dep" "$2"
done

echo "Done!"

Wydajemy wówczas polecenie:

 bash ./ref.sh <path to the binary> <path to copy the dependencies>

czyli np w przypadku aplikacji o nazwie myApp:

 mkdir libs
 bash ./ref.sh myApp ./libs

Oprogramowanie przyckisków Canon Lide 100 na Linuxie

Aby debugować scanbd używamy polecenia:

sudo scanbd -d7 -f -c /etc/scanbd/scanbd.conf

Output:

 scanbd: foreground
scanbd: config-file: /etc/scanbd/scanbd.conf
scanbd: reading config file /etc/scanbd/scanbd.conf
scanbd: debug on: level: 7
scanbd: dropping privs to uid saned
scanbd: dropping privs to gid scanner
scanbd: group scanner has member:
scanbd: saned
scanbd: drop privileges to gid: 109
scanbd: Running as effective gid 109
scanbd: drop privileges to uid: 108
scanbd: Running as effective uid 108
scanbd: dbus_init
scanbd: dbus match type='signal',interface='org.freedesktop.Hal.Manager'
scanbd: SANE_CONFIG_DIR not set
scanbd: sane version 1.0
scanbd: Scanning for local-only devices
^Xscanbd: start_sane_threads
scanbd: start dbus thread
scanbd: Not Primary Owner (2)
scanbd: timeout: 500 ms
scanbd: Iteration on dbus call

Przykładowa konfiguracja:

global {
       
        debug   = true
        debug-level = 2
        user    = saned
        group   = scanner
        saned   = "/usr/sbin/saned"

       
        timeout = 500
        pidfile = "/var/run/scanbd.pid"
       
        environment {
                device = "SCANBD_DEVICE"
                action = "SCANBD_ACTION"
        }
        function function_knob {
                filter = "^message.*"
                desc   = "The value of the function knob / wheel / selector"
                env    = "SCANBD_FUNCTION"
        }
        function function_mode {
                filter = "^mode.*"
                desc   = "Color mode"
                env    = "SCANBD_FUNCTION_MODE"
        }
 
        action scan {
                filter = "^scan.*"
                numerical-trigger {
                        from-value = 1
                        to-value   = 0
                }
                desc   = "Scan to file"
                script = "/etc/scanbd/copy.sh"
        }
        action email {
                filter = "^email$"
                string-trigger {
                        from-value  = ""        
                        to-value    = "^email.*"
                }
                desc   = "Scan to email"
                script = "/etc/scanbd/mail.sh"
        }
        action copy {
                filter = "^copy$"
                string-trigger {
                        from-value  = ""
                        to-value    = "^copy.*"
                }
                desc   = "Copy to printer"
                script = "/etc/scanbd/copy.sh"
        }
        action preview {
                filter = "^preview$"
                numerical-trigger {
                        from-value = 1
                        to-value   = 0
                }
                desc   = "Preview"
                script = "/etc/scanbd/scan.sh"
        }
        action globaltest {
                filter = "^message.*"
                desc   = "Test (print all env vars)"
                script = "/etc/scanbd/pdf.sh"
        }
        action globaltest {
                filter = "^pdf.*"
                desc   = "Test (print all env vars)"
                script = "/etc/scanbd/pdf.sh"
        }
}

include(scanner.d/canon.conf)

Zwróć uwagę na ostatnie linijki, które powinne zaierać Twój skaner.

W plikach mamy nazwy script np:
/etc/scanbd/pdf.sh

przykładowy plik:

#!/bin/sh
TMPFILE="/tmp/image.tiff"
LOCKFILE="/tmp/copy.lock"

echo "pdf tworzę" >> /var/log/syslog

/usr/bin/scanimage --mode lineart -B10M --resolution 600 | pnmtops -imageheight 11 -imagewidth 8.5 | ps2pdf - /home/szymon/skaner/output.pdf | /usr/bin/mail -s "PDF" -a /home/szymon/skaner/output.pdf szymon@artmetic.pl
 
pamiętajmy o nadaniu uprawnień plikom:
 
chmod +x /etc/scanbd/pdf.sh

Linux błąd filtru i pytania o hasło drukarki – naprawa.

Dziś po upgradzie do Ubuntu 16.04 moja drukarka odmówiła posłuszeństwa, a co gorsza w panelu z drukarkami jestem ciągle atakowany o podanie hasła więc postanowiłem po wielu nieudanych próbach podawania prawidłowego hasła jednak odpalić ją z roota. Jednak to nie był koniec kłopotów bo wyświetlał się ciągle komunikat o brakującym filtrze do drukarki. A więc rozwiązałem to tak:

sudo system-config-printer

następnie usunąłem i dodałem. Drukarka wystartowała ale od razu przeszedłem do kolejki wydruku bo trochę zaległych dokumentów tam wpadło 🙂

How to get serial numbers of Linux devices?

To get a serial number we can use this command:

udevadm info -a -n /dev/ttyUSB0 | grep '{serial}' | head -n1

udevadm info -a -n /dev/disk/by-id/ata-OCZ-AGILITY3_OCZ-ABF89Y0W7J4E333X

After this we get CEK509 and we add to:

cat /etc/udev/rules.d/51-android.rules

example

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="1d6b", ATTRS{serial}=="CEK509", SYMLINK+="arduino"

tty – that can be for example usb

Other numbers we can get from command:

szymon@szymon:~$ lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 04f2:b1e5 Chicony Electronics Co., Ltd
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 002: ID 0b05:1788 ASUSTek Computer, Inc. BT-270 Bluetooth Adapter
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 093a:2521 Pixart Imaging, Inc. Optical Mouse
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

after this reload udev:

udevadm control --reload-rules && udevadm trigger

Jak stworzyć serwer DHCP na Linuxie?

Poniżej przykładowa konfiguracja:

cat /etc/dhcp/dhcpd.conf

default-lease-time 86400; #czas w sekundach okresu dzierżawy ip max-lease-time 86400; # maksymalny czas w sekundach okresu dzierżawy ip option subnet-mask 255.255.255.0; option domain-name-servers 127.0.0.1;#,8.8.8.8; #domyślne adresy domenowe dla naszego hosta; lepiej użyć dns-a, który daje nam dostawca lub dns google 8.8.8.8 lub 8.8.4.4 option domain-name "artmetic.pl"; # opcjonalna nazwa domeny ddns-update-style none; server-name artmetic; # nazwa serwera subnet 192.168.2.0 netmask 255.255.255.0 { interface "eth0"; # interfejs sieciowy, którego będzie dotyczyć rozdawanie adresów ip option subnet-mask 255.255.255.0; option routers 192.168.1.1; next-server 192.168.1.1; option domain-name-servers 8.8.8.8, 8.8.4.4; pool { # allow members of "DRBL-Client"; range 192.168.1.2 192.168.1.3; // zakres adresów ip, które mogą zostać przydzielone } } subnet 10.1.1.0 netmask 255.255.255.0 { interface "eth1"; # interfejs sieciowy, którego będzie dotyczyć rozdawanie adresów ip option subnet-mask 255.255.255.0; range 10.1.1.5 10.1.1.60; # zakres adresów ip, który może zostać przydzielony option domain-name "artmetic.pl"; option domain-name-servers 89.78.78.230,8.8.8.8, 8.8.4.4; # tutaj podajemy adresy dns, które zamieniają adresy nazwy domen na adresy ip option routers 10.1.1.1; # domyślna droga, przez którą się łączą hosty do dhcp-a option broadcast-address 10.1.1.255; # adres rozgłoszeniowy (broadcast) default-lease-time 3600; #okres dzierżawy w sekundach max-lease-time 28800; # maksymalny okres dzierżawy deny unknown-clients; # niespodzianka dla nieznanych hostów, czyli nikt niepowołany się nie połączy } Poniżej definicja pierwszego urządzenia/hosta: host laptop { hardware ethernet E6:B9:C5:1D:FA:97; # adres MAC fixed-address 10.1.1.5; # użyłem pierwszego możliwego adresu z zakresu od 10.1.1.5 10.1.1.60 # option domain-name "artmetic.pl"; # option domain-name-servers 8.8.8.8; } host komorka-android { hardware ethernet 01:70:4c:c5:1e:32; fixed-address 10.1.1.6; option domain-name-servers 8.8.8.8, 8.8.4.4; # domyślne adresy dns dla naszego hosta } host VirtulaBox { hardware ethernet 08:01:27:32:68:00; fixed-address 10.1.1.10; } host telewizor { hardware ethernet c8:44:10:64:49:e1; fixed-address 10.1.1.15; }

Następnie restartujemy usługę poleceniem:

sudo /etc/init.d/isc-dhcp-server restart

Sudoers, nadawanie uprawnień zwykłym użytkownikom

Uprawnienia użytkowników są jednym z fundamentalnych paradygmatów w systemach Linux. Zwykli użytkownicy mają ograniczone uprawnienia, aby zredukować ich wpływ na działanie systemu i ograniczyć go do ich własnego środowiska, po którym mogą się poruszać.

Użytkownikiem specjalnym z punktu widzenia całego systemu jest super- użytkownik zwany root-em. Root może wykonywać wszystkie polecenia, chyba że charakter aplikacji na to nie pozwala (np. VLC), ponieważ mógłby zostać uszkodzony sprzęt.

Konto roota ma charakterystyczny uuid:
root@szymon:/home/szymon# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash

Poniżej kilka słów o tym, w jaki sposób można nadawać użytkownikom uprawnienia do wykonywania niektórych poleceń. Do tego używam systemu Ubuntu 14.04.

Aby zalogować się na konto roota wydajemy polecenie:

sudo su

Aby wyjść z konsoli roota i wrócić do naszego użytkownika wydajemy polecenie:

exit

Aby wykonywać polecenia z uprawnienieniami super-użytkownika, wydajemy polecenie:

sudo polecenie

Następnie zostaniemy poproszeni o hasło. Przez kolejne 5 minut będziemy mogli wykonywać polecenia na prawach roota bez podawania hasła. Aby uniknąć sytuacji, gdzie polecenie wymaga użycia uprawnień roota, możemy dodać nowego użytkownika i polecenie do pliku konfuguracyjnego.

Aby to zrobić, trzeba wyedytować plik /etc/sudoers. Należy to zrobić za pomocą polecenia:

sudo visudo

Dzięki temu unikniemy kłopotów związanych ze złą składnią, którą waliduje przed zapisem program visudo.

Po otwarciu pliku poleceniem visudo, pojawi nam się w systemie Ubuntu domyślny edytor tekstowy w terminalu nano. W innych systemach może otworzyć nam się plik w vi.

Aby zmienić edytor możemy wydać polecenie:

sudo update-alternatives --config editor

Będziemy wtedy mogli wybrać jeden z alternatywnych edytorów, znajdujących się w /usr/bin/nazwaEditora.

Są 3 dostępne alternatywy dla editor (dostarczające /usr/bin/editor):

Wybór Ścieżka Priorytet Status ------------------------------------------------------------ * 0 /bin/nano 40 tryb auto 1 /bin/ed -100 tryb ręczny 2 /bin/nano 40 tryb ręczny 3 /usr/bin/vim.tiny 10 tryb ręczny

W CentOS, możesz dokonać zmiany w pliku ~/.bashrc:
export EDITOR=/path/to/nazwaEditora

A następnie, wydając polecenie:

. ~/.bashrc

Po ustawieniu wygodnego dla nas edytora, możemy wydać polecenie:

sudo visudo

Domyślna konfiguracja znajdująca się w pliku sudoers wygląda w następujący sposób (bez komentarzy):

Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" root ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d

Pierwsza linijka „Defaults env_reset”, czyści wszystkie zmienne użytkownika, ze względów bezpieczeństwa, z sesji użytkownika sudo.

Następna linijka – rozpoczynająca się „Defaults secure_path=…” – ustawia ścieżkę, gdzie można odnaleźć aplikacje, które są używane w systemie przy wydawaniu polecenia sudo.

Następne liniki odnoszą się do uprawnień użytkowników:

szymon ALL=(ALL:ALL) ALL

Nazwa szymon odnosi się do użytkownika, którego reguły będą dotyczyć. Pierwsze ALL odnosi się do hosta, którego reguła dotyczy; następne „ALL” (pierwsze w nawiasie) odnosi się do możliwości wykonywania poleceń przez użytkownika i kolejne do grupy.
Ostatnie all odnosi się do poleceń – w tym przypadku użytkownik szymon może wszystko wykonywać bez użycia polecenia sudo. Nie jest to jednak zalecane.

Ostatnie dwie linijki są podobne do uprawnień użytkownika, odnoszą się jednak do grup użytkowników i są poprzedzone %.:

%admin ALL=(ALL) ALL

W przypadku powyższym grupa administatorów może wykonywać każde polecenie przez każdego użytkownika na każdym hoście.

Aby wygenerować aliasy użytkowników należących do grup, które ułatwią nam pisanie reguł, możemy je utworzyć w poniższy sposób. Należy pamiętać przy tym, że nazwy grup powinny zaczynać się wielkimi literami:

User_Alias GROUPONE = szymon, maria, marta User_Alias NINJA = enrike, szymon, marek

Aby umożliwić wykonywanie restartowania apache’a (usługi) określonej grupie możemy dopisać regułę dla grupy NINJA w następujący sposób:

NINJA ALL = /usr/bin/apache restart

Możemy również zezwolić użytkownikom na wykonywanie kilku poleceń, za pomocą aliasu dla poleceń.

Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart NINJA ALL = POWER

W poniższym poleceniu możemy umożliwić grupie pierwszej wykonywać polecenia jako użytkownik „www-data” lub „apache”:

Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL

Jeżeli chcemy, aby użytkownik mógł wykonać dane polecenie bez potrzeby wprowadzania przez niego hasła, możemy utworzyć następującą regułę:

GROUPONE ALL = NOPASSWD: /usr/bin/rm

NOPASSWD oznacza, że nie będzie wydawana prośba o podanie hasła. Jest to bardzo przydatne przy pisaniu skryptów, ponieważ nie przerywa ich wykonywania.
Antagonizmem do NOPASSWD jest PASSWD, które domyślnie wymusza podanie hasła.

GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill

Kolejnym ważnym poleceniem jest NOEXEC, które ochrania przed niebezpiecznym zachowaniem wykonania niektórych programów.

Np polecenie „less” może spowodować działanie innych programów:

szymon ALL = NOEXEC: /usr/bin/less

Jest jeszcze kilka interesujących poleceń, które można wykorzystać przy nadawaniu uprawnień grupom. Jeżeli mamy dodanego użytkownika lub grupę w pliku konfiguracyjnym, możemy – dodając flagę -u dla użytkownika lub -g dla grupy – wydać polecenie jako określony użytkownik/grupa:

sudo -u run_as_user polecenie sudo -g run_as_group polecenie

Dla wygody domyślnie sudo zapisuje uwierzytelnienie na pewien okres czasu, oznacza to, że nie trzeba podawać polecenia przez pewien okres czasu.

Należy o tym pamiętać i dla celów bezpieczeństwa możemy usunąć zegar opóźniający poleceniem:

sudo -k

Aby odłożyć zaś wymuszenie wpisania hasła możemy posłużyć się poleceniem:

sudo -v

By sprawdzić, jakie mamy uprawnienia w chwili obecnej, możemy wydać polecenie:

szymon@szymon:~$ sudo -l Pasujące wpisy Defaults dla szymon na szymon: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin Użytkownik szymon może uruchamiać na szymon następujące polecenia: [cce_bash width="100%" no_cc="true"] (ALL : ALL) ALL

Dzięki poleceniu mamy wylistowane wszystkie reguły dla użytkownika z pliku /etc/sudoers. Dzięki temu będziesz mógł się dowiedzieć co możesz zrobić jako użytkownik, wydając polecenie sudo.

Niekiedy zdarza się, że wydajesz jedno i to samo polecenie polecenie, i zapominasz wpisać sudo. W takiej sytuacji, jeżeli używasz tego samego ostatniego polecenia, możesz użyć skrótu:

szymon@szymon:~$ sudo !! sudo sudo -l Pasujące wpisy Defaults dla root na szymon: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin Użytkownik root może uruchamiać na szymon następujące polecenia: (ALL : ALL) ALL

Jeżeli chcesz dla zabawy, aby po każdym wpisaniu hasła były generowane śmieszne komunikaty, możesz dopisać w pliku następującą konfiguracje:

sudo visudo Defaults insults

This will cause sudo to return a silly insult when a user types in an incorrect password for sudo. We’ll use sudo -k to clear the previous sudo cached password to try it out:

szymon@szymon:~$ sudo -k szymon@szymon:~$ sudo ls szymon@szymon:~$ sudo su [sudo] hasło użytkownika szymon: I feel much better now. [sudo] hasło użytkownika szymon: I don't wish to know that.

Możemy też wymusić, aby dany użytkownik nigdy nie zapamiętał hasła użytkownika w pliku konfiguracyjnym:

Defaults:użytkownik timestamp_timeout=0

Na sam koniec należy wspomnieć, że ze względów bezpieczeństwa powinieneś się dwa razy zastanowić, jakie uprawnienia nadejesz użytkownikom, a także nie powinieneś nadawać zwykłym użytkownikom uprawnień administracyjnych.