Home / Community / Blog

Przetestowałem zabezpieczenie przed przypadkowy zrobieniem commit'a do repozytorium bez podania numeru zgłoszenia (ticket). Zrobiłem to za pomocą hook'a pre-commit. Wszystkie polecenia podaję względem katalogu repozytorium, u mnie jest to /var/lib/svn/test. Skopiowałem szablon skryptu (parametr -p jest ważny, bo inaczej można popsuć uprawnienia)

cp -p hooks/pre-commit.tpl hooks/pre-commit
chmod u+x hooks/pre-commit

i wykomentowałem linię:

commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

na koniec po innych testach, tuż przed linią

exit 0

dopisałem taki kawałek kodu

blad=0
$SVNLOOK log -t "$TXN" "$REPOS" \
| grep "#[1-9][0-9]*" > /dev/null || blad=1
if [ $blad -eq 1 ] ; then
    echo -e "Dodaj numer ticket'a,\nnp.: Zgloszenie #123" 1>&2
    exit 2
fi

który sprawdza czy w treści komentarza zawiera #N (gdzie N to dowolna liczba naturalna większa od 0) i zwraca komunikat błędu - użytkownik zobaczy to co wysyłane jest na wyjście błędu. Właściwy test to:

grep "#[1-9][0-9]*"

Dla Trac'a to wystarczy. Można go rozbudować, np. o sprawdzenie czy zawiera refs #N (N to znowu ciąg cyfr) - tak, żeby w Redmine ładnie pokazywał. Wtedy warunek będzie wyglądał tak (ja używam tylko refs):

grep "refs #[1-9][0-9]*"

Oczywiście można jeszcze dodać sprawdzanie pozostałych Referencing keywords oraz Fixing keywords.

Wypadało by też zmienić wyświetlany komunikat na np. Podaj numer zgłoszenia poprzedzony słowem refs, np:\nrefs #123, ale by wstawić tam znak końca wiersza (\n) trzeba dodać parametr -e do polecenia echo. Razem wygląda tak:

echo -e "Podaj numer zgłoszenia poprzedzony słowem refs, \
np:\nrefs #123" 1>&2

Mechanizm uchwytów (hook) do zdarzeń można wykorzystać dowolnie, także do bardziej zaawansowanych testów: np. by zabezpieczyć przed commit'em kodu który się nie da skompilować (chociaż ja bym tego nie robił) lub automatycznego budowania po commit'cie za pomocą post-commit (tego też bym nie robił).

Podczas drukowania (przez PDF Generator z pakietu Samba czyli ps2pdf) dostawałem uszkodzony plik. Pierwsza strona była pusta a na drugiej był komunikat

ERROR: undefined
OFFENDING COMMAND: eexec
STACK:
/quit
-dictionary-
-mark

problem istniał już wcześniej i jest na niego rozwiązanie.

Żeby to sprawdzić trzeba przestawić skrypt print-pdf (u mnie był w katalogu /usr/share/samba/scripts/), żeby nie kasował pośredniego pliku *.ps. Najłatwiej dodać opcję

KEEP_PS=1

w pliku /etc/samba/print-pdf.conf. Potem wycięcie linii z wygenerowanego pliku (u mnie Remote Downlevel Document.ps) pomiędzy

%ADOBeginClientInjection: DocumentSetup Start "No Re-Distill"
%% Removing the following eleven lines is illegal, subject to the Digital Copyright Act of 1998.
mark currentfile eexec

i

cleartomark
%ADOEndClientInjection: DocumentSetup Start "No Re-Distill"

(łącznie z tymi które pokazałem) powoduje, że polecenie

ps2pdf13 -dAutoFilterColorImages=false -sColorImageFilter=FlateEncode \
Remote\ Downlevel\ Document.ps Remote\ Downlevel\ Document.pdf

produkuje prawidłowy plik PDF (u mnie Samba domyślnie nazywa plik Remote Downlevel Document.pdf).

Oczywiście rozwiązanie to jest podane wyłącznie w celach edukacyjnych i nie zalecam jego stosowania.

Konfiguracja postfix'a

Odkomentowałem linię:

mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp

w pliku /etc/postfix/main.cf.

Automatyczne zakładanie skrzynek pocztowych

Domyślnie wymagane jest ręczne założenie skrzynki dla każdego użytkownika. Gdy korzystamy z LDAP może być to niewdzięczne zajęcie. Chciałem, żeby się zakładały automatycznie.

Zgodnie z zaleceniami z sieci dopisałem:

autocreatequota: 20480
unixhierarchysep: yes
quotawarn: 90
autocreateinboxfolders: Drafts|Sent|Trash
autosubscribeinboxfolders: Drafts|Sent|Trash
lmtp_over_quota_perm_failure: 1

do pliku /etc/imapd.conf.
Ta automatyzacja działa tylko gdy użytkownik zaloguje się do serwera POP3 lub IMAP. Dopóki się choć raz nie zaloguje to serwer nie przyjmuje poczty!

Przydało by się zakładanie skrzynki odbywało się gdy serwer postfix autoryzował odbiorcę. Na szczęście CurierIMAP z CentOS ma nałożoną łatę Autocreate INBOX patch for Cyrus. Po ustawieniu:

createonpost: yes

w pliku /etc/imapd.conf skrzynka będzie zakładana gdy przyjdzie pierwsza wiadomość.

Te dwie opcje działają jednocześnie - skrzynka jest zakładana przy pierwszej wiadomości lub przy pierwszym zalogowaniu się.

Konwersja mailbox do maildir

To nie jest takie proste. Wcześniejsze wiadomości z pliku mbox można zaimportować do Thunderbird'a za pomocą dodatku ImportExportTools, jeżeli konto jest zdefiniowane jako IMAP to wiadomości powinny trafić na serwer, ale tego nie testowałem.

Jak już postawiłem usługę katalogową, to chciałem użyć jej do autoryzacji do repozytoriów SVN do których był dostęp przez Apache.

W sumie jest to proste:

<IfModule mod_dav.c>
    <Location /svn>
        DAV svn
        SVNParentPath /var/lib/svn/repositories
        SVNListParentPath on
        AuthType Basic
        AuthName "Dostep do repozytorium"
        AuthBasicProvider ldap
        AuthLDAPURL "ldap://localhost/dc=jaqb,dc=gda,dc=pl" NONE
        AuthLDAPBindDN "cn=Manager,dc=jaqb,dc=gda,dc=pl"
        AuthLDAPBindPassword jakiesmocnehaslo
        AuthLDAPGroupAttribute memberUid
        AuthLDAPGroupAttributeIsDN off
        Require ldap-group cn=svnowcy,ou=groups,dc=jaqb,dc=gda,dc=pl
    </Location>
</IfModule>

kluczowe są dwa wpisy:

AuthLDAPGroupAttribut memberUid
AuthLDAPGroupAttributeIsDN off

bez tego Apache zakładał, że użytkownicy są wpisani jako member lub uniquemember i na dodatek jako np.:

uid=jaqb,ou=People,dc=jaqb,dc=gda,dc=pl

a domyślnie LAM zakłada jako np.: jaqb w memberUid.

Pakiety

Zaczynamy od instalacji pakietów:

yum install openldap-servers openldap-clients

od razu można ustawić, żeby serwer (slapd) się włączał automatycznie:

chkconfig --add slapd
chkconfig slapd on

na razie go nie włączam.

Jedna ważna uwaga. W pakiecie openldap jest używany plik /etc/openldap/ldap.conf, ale niektóre pakiety (np.: kiedyś nss_ldap, a obecnie pam_ldap) używają pliku /etc/ldap.conf lub /etc/pam_ldap.conf. Dwa różne plik z konfiguracją powodują problemy, dlatego zwykle kasuję plik /etc/ldap.conf i w jego miejsce tworzę link symboliczny o takiej samej nazwie wskazujący na /etc/openldap/ldap.conf:

rm /etc/ldap.conf
rm /etc/pam_ldap.conf
ln -s /etc/openldap/ldap.conf /etc/ldap.conf
ln -s /etc/openldap/ldap.conf /etc/pam_ldap.conf

Skopiowałem domyślną konfigurację bazy i ustawiłem uprawnienia:

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap

Dostosowałem wartości olcSuffix i olcRootDN w pliku

/etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif

u mnie wyglądają tak:

olcSuffix: dc=jaqb,dc=gda,dc=pl
olcRootDN: cn=Manager,dc=jaqb,dc=gda,dc=pl

Wygenerowałem skrót hasła (haslo) poleceniem slappasswd:

slappasswd -u
New password:
Re-enter new password:
{SSHA}B6+pPk3uabUwf034GKcToi3a75A44Jws

i ustawiłem je w konfiguracji jakże oczywistą komendą:

echo "olcRootPW: {SSHA}B6+pPk3uabUwf034GKcToi3a75A44Jws" >> \
/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif

od razu ustawiłem, żeby akceptował połączenia szyfrowane zmieniłem wartość SLAPD_LDAPS w pliku /etc/sysconfig/ldap na yes:

SLAPD_LDAPS=yes

i uruchomiłem serwer

/etc/init.d/slapd start

Otworzyłem port dla połączeń szyfrowanych:

iptables -I INPUT -p tcp --dport 636 -j ACCEPT

Teraz już można podłączyć się do serwera za pomocą polecenia:

ldapsearch -H ldaps:// localhost -D "cn=Manager,dc=jaqb,dc=gda,dc=pl" -W

nic tam nie ma bo baza jest pusta a na dodatek certyfikat może być nie pasujący, ale można się podłączyć.

GUI

Ściągnąłem i zainstalowałem obsługę LDAP w PHP i LDAP Account Manager'a:

yum install php-ldap
wget "http://downloads.sourceforge.net/project/lam/LAM/3.9/ldap-account-manager-3.9-0.fedora.1.noarch.rpm?r=&ts=1355006390&use_mirror=netcologne"
rpm -i ldap-account-manager-3.9-0.fedora.1.noarch.rpm

(jest już dostępna wersja 4.0.RC1).

W przypadku SElinux'a trzeba zmienić kontekst pliku lam.conf (i kilku innych potrzebnych później):

setenforce Permissive
chcon -t httpd_t /var/lib/ldap-account-manager/config/lam.conf
chcon -t httpd_t /var/lib/ldap-account-manager/config/config.cfg
chcon -t httpd_t /var/lib/ldap-account-manager/config/profiles/default.user
setenforce Enforcing

lub od razu dla całego katalogu:

setenforce Permissive
chcon -R -t httpd_t /var/lib/ldap-account-manager/config
setenforce Enforcing

Teraz można się zalogować do LAM przez adres:

http://adres.ip.kompuerta.lub.nazwa/lam

Najpierw wypadałoby zmienić domyślne hasło. W tym celu w prawym górnym rogu kliknąć LAM configuration. i wejść w Edit general settings. Domyślne hasło to lam. Nowe hasło ustawić w ramce Change master password.

Teraz należy dostosować konfigurację. Znowu w prawym górnym rogu kliknąć LAM configuration. Tam trzeba wejść w Edit server profiles, zmienić w zakładce General settings: Tree suffix - w zależności od domeny i w ramce Security settings hasło i List of valid users - tam wpisałem

cn=Manager,dc=jaqb,dc=gda,dc=pl

a w zakładce Account types: LDAP suffix dla każdego z typów kont. U mnie wygląda to tak

ou=users,dc=jaqb,dc=gda,dc=pl
ou=groups,dc=jaqb,dc=gda,dc=pl
ou=machines,dc=jaqb,dc=gda,dc=pl
dc=jaqb,dc=gda,dc=pl

dla odpowiednio Users, Groups, Hosts i Samba domains.

Teraz można się zalogować wpisując ustawione wcześniej hasło. Przy pierwszym logowaniu baza jest pusta, więc LAM wyświetli komunikat podobny do tego:

The following suffixes are missing in LDAP. LAM can create them for you.
ou=users,dc=jaqb,dc=gda,dc=pl
ou=groups,dc=jaqb,dc=gda,dc=pl
ou=machines,dc=jaqb,dc=gda,dc=pl
dc=jaqb,dc=gda,dc=pl

kliknięcie Create jest równoznaczne zaimportowaniu pliku init.ldiff o zawartości:

# jaqb.gda.pl
dn: dc=jaqb,dc=gda,dc=pl
objectClass: organization
objectClass: dcObject
dc: jaqb
o: jaqb

# users, jaqb.gda.pl
dn: ou=users,dc=jaqb,dc=gda,dc=pl
objectClass: organizationalUnit
ou: users

# groups, jaqb.gda.pl
dn: ou=groups,dc=jaqb,dc=gda,dc=pl
objectClass: organizationalUnit
ou: groups

# machines, jaqb.gda.pl
dn: ou=machines,dc=jaqb,dc=gda,dc=pl
objectClass: organizationalUnit
ou: machines

pliku poleceniem

ldapadd -H ldap://localhost -D "cn=Manager,dc=jaqb,dc=gda,dc=pl" -W -f init.ldiff

Zakładanie użytkowników

Chciałem, żeby użytkownicy byli rozróżniani po uid'zie, więc zmieniłem w Tools, Profile editor domyślny profil (default) dla użytkowników RDN identifier na uid i przy okazji zmieniłem domyślną powłokę (Login shell) na /bin/false.

Najpierw trzeba założyć grupę - nazwałem ją wszyscy.

Potem wystarczy wypełnić wymagane pola, oznaczone gwiazdką. Tak naprawdę wystarczy nazwisko (Last name), resztę uzupełni LAM jak przejdziemy na zakładkę Unix. LAM przyjmuje konwencję nazwy użytkownika jako pierwsza litera imienia i nazwisko, dla Jana Kowalskiego będzie to jkowalski.

Teraz wystarczy skonfigurować inne usługi by korzystały z usługi katalogowej.

Czasem potrzebny jest dysk sieciowy (coś na kształt dropbox'a), ale ze względów bezpieczeństwa (lub polityki) nie chcemy/możemy korzystać z usług Dropbox, GDrive, SkyDrive, itp. Rozwiązań jest kilka tu opiszę tylko niektóre (ściągniete min. od alternativeTo).

Synchronizację katalogów wraz z wersjonowaniem zapewni SparkleShare. Bazuje na Git'cie. Posiada klientów na Linux, Windows i MacOS.

Te same funkcje może pełnić również Syncany. Ciekawostka, że jako "backend" może używać Drobbox'a ;-)

W zasadzie do najprostszych zastosowań wystarczy opisany przeze mnie niedawno WebDAV, ale przy pracy z dokumentami OpenOffice mam z nim problemy (w momencie zapisu pliku zeruje jego zawartość i krzyczy, ze brak dostępu).

Jeszcze innym rozwiązaniem jest wielo-platformowe narzędzie do synchronizacji katalogów unison (niestety nie jest już aktywnie rozwijane).

Gdyby ktoś miał ochotę postawić własną chmurę (IaaS) to może sprawdzić ownCloud (zbudowane na Debianie lub pochodnej) lub eucalyptus (podobno wzorowali się na Amazon EC2 i zachowali zgodność na poziomie API).

Utworzyłem nowy plik /etc/httpd/conf/webapps.d/plikiwebdav.conf (na współczesnym systemie byłby pewnie /etc/httpd/conf.d/plikiwebdav.conf) z konfiguracją serwera apache:

Alias /pliki /var/www/tusapliki

<Directory /var/www/tusapliki/>
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

<Location /pliki>
    DAV On
    Order allow,deny
    AuthType Digest
    AuthName "Dostep do plikow"
    AuthUserFile /var/lib/dav/haselka
    Require valid-user
    Order allow,deny
    Allow from 1.2.3.4
    Satisfy any
</Location>

oczywiście katalog /var/www/tusapliki musi istnieć. Tutaj dodatkowo wpuszczam bez hasła z adresu IP 1.2.3.4 - to nie jest potrzebne.

Zakładam pierwszego użytkownika:

htdigest  -c /var/lib/dav/haselka "Dostep do plikow" ja

i pozostałych:

htdigest  /var/lib/dav/haselka "Dostep do plikow" user2
htdigest  /var/lib/dav/haselka "Dostep do plikow" user3

itd. Teraz wystarczy przeładować serwer. Testy można wykonać za pomocą przeglądarki.

Podłączenie się do zasobu z MS Windows:

net use * http://adres.mojego.serwera.pl/pliki

spyta się o użytkownika i hasło. Jeżeli podamy hasło w poleceniu:

net use * http://adres.mojego.serwera.pl/pliki tajnehaslo \USER:ja \PERSISTENT:yes

i każemy zapamiętać to doda zasób na stałe.

Na serwerze nie mam monitora ani karty graficznej, no bo i po co, ale w razie problemów dobrze było by się do niego zalogować w jakiś w miarę niezawodny sposób. Jeżeli komputer jest wyposażony w port szeregowy (/dev/ttyS0) można uruchomić na nim konsolę.

Wystarczy wpis w pliku /etc/inittab:

T0:2345:respawn:/sbin/mgetty -r -s 115200 ttyS0

po restarcie będzie się można zalogować podłączając terminal (np laptopa z przejściówką USB->RS232).

Dodatkowo należałoby dodać do parametrów jądra parametr console:

console=tty0 console=ttyS0,115200n8

aby komunikaty podczas startu też były wyświetlane na porcie szeregowym. Pierwsze wywołanie (z parametrem tty0) potrzebne tylko wtedy gdy komputer ma kartę graficzną, ale normalnie nie jest używana.

Ściągnąłem źródła:

cd /tmp
wget http://download.edgewall.org/trac/Trac-1.0.tar.gz
tar -xzf Trac-1.0.tar.gz
cd Trac-1.0/

Za pierwszym razem nie przeczytałem dokładnie zawartości pliku INSTALL, więc doinstalowałem brakujący pakiet:

yum install python-setuptool

Zainstalowałem poleceniem:

python ./setup.py install

wygenerowałem środowisko

mkdir -p /var/lib/trac/pierwsze
trac-admin /var/lib/trac/pierwsze initenv

i od razu nadałem sobie uprawnienia:

trac-admin /var/lib/trac/pierwsze
permission add ja TRAC_ADMIN
quit

Wygenerowałem strukturę katalogów poleceniem:

trac-admin /var/lib/trac/pierwsze deploy /var/www/trac/

i w pliku "/var/www/trac/tracother/cgi-bin/trac.wsgi" dopisałem:

os.environ['TRAC_ENV_PARENT_DIR'] = '/var/lib/trac'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/trac/eggs'

i zmieniłem

if not 'trac.env_parent_dir' in environ:
  environ.setdefault('trac.env_path', '/var/lib/trac/pierwsze')

na

if not 'trac.env_parent_dir' in environ:
  environ.setdefault('trac.env_parent_dir', '/var/lib/trac')

Założyłem wymagany katalog: "mkdir /var/www/trac/eggs"

Założyłem plik "/etc/httpd/conf.d/trac-wsgi.conf"

WSGIScriptAlias /trac /var/www/trac/cgi-bin/trac.wsgi

<Directory /var/www/trac/cgi-bin>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

<Location /trac>
    AuthType Digest
    AuthName "Dostep do repozytorium"
    AuthUserFile /var/lib/svn/haselka
    Require valid user
</Location>

Na koniec nadałem uprawnienia do katalogów:

chown -R apache /var/lib/trac

i przeładowałem serwer:

/etc/init.d/httpd restart

Jeżeli chcemy zapewnić użytkownikom w miarę łatwy sposób na wymianę dużych plików a nie chcemy zwiększać limitów rozmiaru załączników w poczcie to można skorzystać z jednego z gotowych narzędzi:

  • Event Horizon - niestety projekt już od 2010r. nie rozwijany
  • F*EX - ten testowałem

Co można powiedzieć: działa i się sprawdza.

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31