<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>my personal page &#187; linux</title>
	<atom:link href="http://konrad.bechler.pl/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://konrad.bechler.pl</link>
	<description>Tutaj powinno być coś mądrego, ale nie przychodzi mi nic do głowy...</description>
	<lastBuildDate>Wed, 01 Feb 2012 13:28:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Jak wysłać maila?</title>
		<link>http://konrad.bechler.pl/2012/02/jak-wyslac-maila/</link>
		<comments>http://konrad.bechler.pl/2012/02/jak-wyslac-maila/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 13:27:28 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[konsola]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[x.509]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=510</guid>
		<description><![CDATA[Ostatnio pojawił się pewien problem. Ktoś w firmie wymyślił, że będziemy do klientów wysyłać jakieś bardzo ważne dane za pomocą maila. Dane te występują w formie plików PDF i są na tyle wrażliwe, że trzeba je jakoś zabezpieczyć. Idea jak najbardziej słuszna, bo kto by chciał, aby dane o jego wynagrodzeniu czy stanie zdrowia były [...]]]></description>
			<content:encoded><![CDATA[<p STYLE="text-align: justify">Ostatnio pojawił się pewien problem. Ktoś w firmie wymyślił, że będziemy do klientów wysyłać jakieś bardzo ważne dane za pomocą maila. Dane te występują w formie plików PDF i są na tyle wrażliwe, że trzeba je jakoś zabezpieczyć. Idea jak najbardziej słuszna, bo kto by chciał, aby dane o jego wynagrodzeniu czy stanie zdrowia były narażone na przeczytanie przez osoby niepowołane. Oczywiście to tylko przykłady, ale dość dobrze oddają zagrożenia, jakie czyhają na nas w dobie wszechobecnego i nielimitowane dostępu do Internetu (<a href="Anti-Counterfeiting Trade Agreement">ACTA</a> i jej podobne próby cenzurowania na razie pomijam).<br />
Podstawowym założeniem dla zabezpieczenia poczty jest wykorzystanie ogólnodostępnej i dobrze zdefiniowanej metody szyfrowania oraz podpisywania treści. Konkretnie <a href="http://en.wikipedia.org/wiki/X.509">X.509</a>, czyli infrastruktura klucza publicznego. Zrobiło się ciekawie, bo o ile wygenerowanie odpowiedniego certyfikatu (a właściwie pary klucz prywatny &#8211; certyfikat) nie jest specjalnie trudne, to wysłanie odpowiednio zabezpieczonego maila z poziomu konsoli Linuksa jest już pewnym wyzwaniem.<br />
Żeby osiągnąć założony cel i zadowolenie klientów, musimy zrobić kilka rzeczy:</p>
<p STYLE="text-align: justify"><strong>1.</strong> Musimy posiadać odpowiedni certyfikat do podpisywania maili. Ponieważ podpisywanie odbywa się za pomocą klucza prywatnego, a potwierdzenia autentyczności można dokonać przy użyciu (ogólnie dostępnego) certyfikatu &#8211; musimy takową w jakiś sposób zdobyć.<br />
Można ją kupić w dowolnym centrum, jak np. <a href="http://www.verisign.com/">VeriSign</a> &#8211; wtedy będziemy wyglądać bardzo profesjonalnie, a nasz certyfikat będzie automatycznie rozpoznawany przez większość używanych obecnie programów. Jest to jedyna rozsądna opcja, jeżeli chcemy taką funkcjonalność oferować klientom. Jednak do testów wygenerowałem sobie certyfikat podpisany przez moje (światowo niezaufane :-)) centrum. Opisów, jak &#8222;zrobić&#8221; sobie taką infrastrukturę jest w Sieci całkiem sporo i nie będę tego teraz opisywał.</p>
<p STYLE="text-align: justify"><strong>2.</strong> Musimy zebrać certyfikaty użytkowników, do których będziemy wysyłać maile. Szyfrowanie danych odbywa się za pomocą certyfikatu (dostępnego publicznie) i bez niego raczej ciężko nam będzie cokolwiek zrobić. Certyfikaty klientów nie muszą by wygenerowane przez zaufane centrum, a nam zależy wyłącznie na tym, aby klucze prywatne, które są z nimi powiązane, były odpowiednio bezpieczne.</p>
<p STYLE="text-align: justify"><strong>3.</strong> Ktoś powinien nam dostarczyć odpowiednie dane, które będziemy wysyłać &#8211; w moim przypadku będą to pliki PDF, które wygeneruje SAP lub jakiś inny potwór, którego działania nie rozumiem.</p>
<p><strong>4.</strong> Trzeba tego PDFa jakoś zaszyfrować, podpisać i wysłać.</p>
<p STYLE="text-align: justify">I tu zaczynają się schody&#8230; o ile zaszyfrowanie i podpisanie maila jest operacją dość prostą:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> .<span style="color: #000000; font-weight: bold;">/</span>plik.txt <span style="color: #000000; font-weight: bold;">|</span> openssl smime <span style="color: #660033;">-encrypt</span> cert_kogos.pem <span style="color: #000000; font-weight: bold;">|</span> openssl smime <span style="color: #660033;">-sign</span> <span style="color: #660033;">-signer</span> cert.pem <span style="color: #660033;">-inkey</span> privkey.pem</pre></div></div>

<p STYLE="text-align: justify">to wysłanie tego mailem w taki sposób, żeby było poprawnie wyświetlone w czytniku poczty, nie jest już takie oczywiste.</p>
<p STYLE="text-align: justify">Próbowałem na różne sposoby, jednak za pomocą &#8222;czystej&#8221; konsoli nie udało mi się osiągnąć tego, co sobie wymyśliłem. Rozwiązaniem okazało się napisanie prostego skryptu w PERLu, który to wszystko po kolei zrobi:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
<span style="color: #000000; font-weight: bold;">use</span> MIME<span style="color: #339933;">::</span><span style="color: #006600;">Lite</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Crypt<span style="color: #339933;">::</span><span style="color: #006600;">SMIME</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$wiadomosc</span> <span style="color: #339933;">=</span> MIME<span style="color: #339933;">::</span><span style="color: #006600;">Lite</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
        From            <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'moj_adres@gmail.com'</span><span style="color: #339933;">,</span>
        To              <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'odbiorca@wp.pl'</span><span style="color: #339933;">,</span>
        Subject         <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'temat'</span><span style="color: #339933;">,</span>
        Type            <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'TEXT'</span><span style="color: #339933;">,</span>
        Data            <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">&quot;Dzien dobry<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>TRESC<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>-- <span style="color: #000099; font-weight: bold;">\n</span>Pozdrawiam,<span style="color: #000099; font-weight: bold;">\n</span>Konrad&quot;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$wiadomosc</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">attach</span><span style="color: #009900;">&#40;</span>
        Type            <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'application/pdf'</span><span style="color: #339933;">,</span>
        Path            <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'tajne_dane.pdf'</span><span style="color: #339933;">,</span>
        Filename        <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'tajne_dane.pdf'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">local</span> <span style="color: #0000ff;">$/</span><span style="color: #339933;">=</span><span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>MY_PKEY<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;certs/moj_klucz.pem&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;open failed: $!&quot;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$privkey</span> <span style="color: #339933;">=</span> <span style="color: #339933;">;</span>
    <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>MY_CERT<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;certs/moj_cert.pem&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;open failed: $!&quot;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$cert</span> <span style="color: #339933;">=</span> <span style="color: #339933;">;</span>
    <span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>TO_CERT<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;certs/cert_odbiorcy.pem&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;open failed: $!&quot;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$to_cert</span> <span style="color: #339933;">=</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">$smime</span> <span style="color: #339933;">=</span> Crypt<span style="color: #339933;">::</span><span style="color: #006600;">SMIME</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$smime</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">setPrivateKey</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$privkey</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$cert</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$smime</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">setPublicKey</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$to_cert</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$tmp</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$smime</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">sign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$wiadomosc</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_string</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>MAIL<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;|/usr/sbin/sendmail -t&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> MAIL <span style="color: #0000ff;">$smime</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">encrypt</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$tmp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">close</span><span style="color: #009900;">&#40;</span>MAIL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p STYLE="text-align: justify">No dobra, biblioteka <a href="http://search.cpan.org/~rjbs/MIME-Lite-3.028/lib/MIME/Lite.pm">MIME::Lite</a> została tutaj użyta dość osobliwie, bo wcale nie do wysyłania maili, ale jest to najprostszy sposób sformatowania maila przed jego zaszyfrowaniem, na który wpadłem. Poza tym, PERLa właściwie nie znam, a ten kod powyżej to &#8222;składanka&#8221; z przykładów, które znalazłem gdzieś w Sieci.</p>
<p STYLE="text-align: justify">Teraz muszę się jeszcze zająć tematem podpisywania samych PDFów. No bo skoro ma być tak super profesjonalnie, to dlaczego nie? :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2012/02/jak-wyslac-maila/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zepsuty YUM</title>
		<link>http://konrad.bechler.pl/2012/01/zepsuty-yum/</link>
		<comments>http://konrad.bechler.pl/2012/01/zepsuty-yum/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 13:45:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[pliki blokad]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=493</guid>
		<description><![CDATA[Tym razem &#8222;case study&#8221; z nie-do-końca działającego systemu. Mamy mało krytyczny serwer, świadczący pewne usługi dla użytkowników. Dopóki działa i robi swoje, nikt się do niego nie dotyka. Ale ostatnio zachciało mi się przejrzeć listę systemów i porobić trochę aktualizacji. Byłem dość mocno zdziwiony, jak po zalogowaniu i wpisaniu &#8222;yum clean all&#8221;, program zawisł. Dosłownie [...]]]></description>
			<content:encoded><![CDATA[<p>Tym razem &#8222;case study&#8221; z nie-do-końca działającego systemu.</p>
<p>Mamy mało krytyczny serwer, świadczący pewne usługi dla użytkowników. Dopóki działa i robi swoje, nikt się do niego nie dotyka. Ale ostatnio zachciało mi się przejrzeć listę systemów i porobić trochę aktualizacji. Byłem dość mocno zdziwiony, jak po zalogowaniu i wpisaniu &#8222;yum clean all&#8221;, program zawisł. Dosłownie &#8211; nie reagował na nic, poza &#8222;kill -9&#8243;. Zacząłem przeglądać logi, porównałem konfigurację, wyłączyłem wszystkie pluginy &#8211; nadal nic. Następnym krokiem byłoby przeinstalowanie pakietu, ale w tym wypadku było to mało realne (no bo przecież do instalacji potrzebny jest właśnie YUM, który nie działa).<br />
Poszedłem więc odrobinę inną drogą i ściągnąłem sobie ręcznie nową wersję bezpośrednio z repozytorium CentOSa (wget jest jednym z bardziej przydatnych narzędzi w ratowaniu systemu). &#8222;rpm -U yum&#8230;&#8221; i&#8230;. wisi!<br />
Okazało się, że uszkodzeniu uległa baza pakietów (a dokładniej, pliki blokad) RPMa. Wystarczyło je usunąć:<br />
<code>rm -f /var/lib/rpm/__db*</code>żeby wszystko wróciło do normy. Warto zapamiętać ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2012/01/zepsuty-yum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Szyfrowanie w Linuksie</title>
		<link>http://konrad.bechler.pl/2012/01/szyfrowanie-w-linuksie/</link>
		<comments>http://konrad.bechler.pl/2012/01/szyfrowanie-w-linuksie/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 08:44:31 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[luks]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=484</guid>
		<description><![CDATA[Jest sobie zdalne centrum danych, w którym umiejscowione są krytyczne dla działania firmy systemy. A skoro są krytyczne, to robimy z nich backupy, dość często nawet i wyjątkowo regularnie. Niestety, kopie zapasowe są na tyle duże, że problematyczne jest kopiowanie ich przez istniejące łącza, a rozbudowa tych ostatnich tylko dla naszej wygody byłaby zdecydowanym przerostem [...]]]></description>
			<content:encoded><![CDATA[<p>Jest sobie zdalne centrum danych, w którym umiejscowione są krytyczne dla działania firmy systemy. A skoro są krytyczne, to robimy z nich backupy, dość często nawet i wyjątkowo regularnie. Niestety, kopie zapasowe są na tyle duże, że problematyczne jest kopiowanie ich przez istniejące łącza, a rozbudowa tych ostatnich tylko dla naszej wygody byłaby zdecydowanym przerostem formy nad treścią (co wcale nie oznacza, że nie robimy backupu &#8222;off site&#8221;, bo byłoby to dużym niedopatrzeniem i zaburzyło procedury <a href="http://pl.wikipedia.org/wiki/Disaster_Recovery">DR</a>).<br />
Potrzebą techniczną jest posiadanie kopii niektórych baz danych, żeby można było w nich grzebać, psuć i niszczyć, a żeby żaden z klientów nie był z tego powodu smutny. Najprostszym rozwiązaniem jest podpięcie dysku USB do maszyny robiącej kopie bezpieczeństwa i przywiezienie takiego dysku (razem z zawartością oczywiście) do biura, gdzie będzie można się nad tym wszystkim znęcać.<br />
Potrzebą biznesową jest za to konieczność zabezpieczenia przewożonych danych w taki sposób, aby potencjalnemu złodziejowi odechciało się walki z tymi zabezpieczeniami. Osobiście uważam to za bardzo rozsądny wymóg, którego warto przestrzegać i który (w skrajnych przypadkach) może w drastyczny sposób ograniczyć straty firmy.</p>
<p>Systemem wykonującym kopie bezpieczeństwa dla wspomnianych przeze mnie systemów jest Linux (konkretnie CentOS w wersji 5). Po przejrzeniu informacji dostępnych w <a href="http://pl.wikipedia.org/wiki/Internet">Internecie</a> okazało się, że metod szyfrowania systemów plików nie ma wcale tak dużo. Pierwszym kandydatem był TrueCrypt, którego z powodzeniem używam w wielu innych miejscach (zarówno zawodowo, jak i prywatnie), jednak &#8211; z niewiadomych mi przyczyn &#8211; był mało stabilny i potrafił wywalić całą maszynę. Znalazłem nawet informację, że problem faktycznie występuje i że zostanie to kiedyś poprawione. Ale potrzebowałem czegoś &#8222;na już&#8221;, więc zacząłem szukać dalej. Ostatecznie padło na <a href="http://code.google.com/p/cryptsetup/">LUKS</a>a. Nie będę się specjalnie rozpisywał, co można za pomocą tego oprogramowania zrobić, bo jest to ładnie opisane na stronie domowej. Ograniczę się jedynie do krótkiej ściągawki, jak wykonać podstawowe czynności.</p>
<p>Załóżmy, że dysk, który chcemy &#8222;zaLUKSować&#8221; to /dev/sdd1. Podstawowym narzędziem, jakiego będziemy używać to &#8222;cryptsetup&#8221;.</p>
<p>Sprawdzanie, czy dane urządzenie nie jest już przypadkiem zaszyfrowane:<br />
<code>cryptsetup isLuks /dev/sdd1 2&gt;&gt;/dev/null &amp;&amp; echo TAK || echo NIE</code><br />
Jeżeli poprzednie polecenie dało wynik negatywny (czyli nie jest jeszcze zaszyfrowane), to możemy je &#8222;sformatować&#8221;:<br />
<code>cryptsetup luksFormat /dev/sdd1</code><br />
Teraz warto sprawdzić, czy operacja się faktycznie udała i podejrzeć nagłówek LUKSa:<br />
<code>cryptsetup luksDump /dev/sdd1</code><br />
Nastepnym krokiem jest &#8222;otworzenie&#8221; zaszyfrowanego urządzenia:<br />
<code>cryptsetup luksOpen /dev/sdd1 bkp</code>Po tej operacji powinno nam się w systemie pojawić nowe urządzenie blokowe, do którego możemy uzyskać dostęp poprzez /dev/mapper/bkp.<br />
<br />
Po zamontowaniu możemy sobie obejrzeć jego &#8222;stan&#8221;:<br />
<code>dmsetup info bkp</code><br />
Jeżeli wszystko się zgadza (a przynajmniej nie ma żadnych rażących błędów), przystępujemy do tworzenia systemu plików:<br />
<code>mke2fs -j /dev/mapper/bkp<br />
</code><br />
Na koniec wystarczy zamontować system plików w systemie:<br />
<code>mount /dev/mapper/bkp /mnt/usb</code>&#8230;i cieszyć możliwością ukrywania naszych ściśle tajnych danych przed światem.</p>
<p>Po zakończeniu zabawy należy oczywiście odpowiednio wszystko pozamykać:<br />
<code>sync<br />
umount /mnt/usb<br />
cryptsetup luksClose bkp</code></p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2012/01/szyfrowanie-w-linuksie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak przesłać dane ze zdalnego systemu?</title>
		<link>http://konrad.bechler.pl/2011/10/jak-przeslac-dane-ze-zdalnego-systemu/</link>
		<comments>http://konrad.bechler.pl/2011/10/jak-przeslac-dane-ze-zdalnego-systemu/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 20:05:01 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=451</guid>
		<description><![CDATA[Załóżmy, że mamy system, który stoi sobie na drugim końcu świata (o ile świat ma dwa końce). Dostęp do tegoż systemu mamy wyłącznie przez SSH i żadna inna usługa na nim nie pracuje. Mam wprawdzie uprawnienia administratora, jednak host strzeżony jest przez &#8222;wielkiego ogniomura&#8221;, który nie pozwala podróżować pakietom innym, niż tym z inicjałami tcp/22 [...]]]></description>
			<content:encoded><![CDATA[<p>Załóżmy, że mamy system, który stoi sobie na drugim końcu świata (o ile świat ma dwa końce). Dostęp do tegoż systemu mamy wyłącznie przez SSH i żadna inna usługa na nim nie pracuje. Mam wprawdzie uprawnienia administratora, jednak host strzeżony jest przez &#8222;wielkiego ogniomura&#8221;, który nie pozwala podróżować pakietom innym, niż tym z inicjałami tcp/22 i nie jesteśmy w stanie nic na to poradzić. I chcemy z tego wspaniałego systemu pobrać plik. W sumie nic prostszego:</p>
<p><code>[kbechler@flame .ssh]$ <strong>scp kbechler@lupus:~/lico-update.sh ~<br />
</strong>kbechler@lupus's password:<br />
lico-update.sh                                                                                                                                  100%   19KB  18.9KB/s   00:00<br />
[kbechler@flame .ssh]$<br />
</code></p>
<p>Trudne to jakoś specjalnie nie było.</p>
<p>A teraz spróbujmy zrobić to samo, ale z <a href="http://en.wikipedia.org/wiki/Device_file#Block_devices">urządzeniem blokowym</a> (bo chcemy zrobić kopię zapasową odmontowanej partycji):</p>
<p><code>[kbechler@flame .ssh]$ <strong>scp kbechler@lupus:/dev/sda2 ~</strong><br />
kbechler@lupus's password:<br />
scp: /dev/sda2: Permission denied<br />
[kbechler@flame .ssh]$<br />
</code></p>
<p>Hmmm, brakuje nam trochę uprawnień :-\<br />
Ale możemy przecież zrobić tak, aby te uprawnienia uzyskać:</p>
<p><code>[kbechler@lupus ~]$ <strong>sudo chmod 644 /dev/sda2</strong><br />
</code></p>
<p>I co teraz?</p>
<p><code>[kbechler@flame .ssh]$ <strong>scp kbechler@lupus:/dev/sda2 ~</strong><br />
kbechler@lupus's password:<br />
scp: /dev/sda2: not a regular file<br />
[kbechler@flame .ssh]$<br />
</code></p>
<p>Upsss&#8230;.chyba niewiele to dało. Przywróćmy lepiej poprzednie prawa:<br />
<code>[kbechler@lupus ~]$ <strong>sudo chmod 64 /dev/sda2</strong><br />
</code><br />
No dobra, to co możemy zrobić? Ano możemy połączyć siłę SSH z wielce użytecznym narzędziem <a href="http://en.wikipedia.org/wiki/Dd_%28Unix%29">dd</a> oraz <a href="http://en.wikipedia.org/wiki/Pipeline_%28Unix%29">potokami</a>:</p>
<p><code>[kbechler@flame ~]$  <strong>ssh kbechler@lupus "sudo dd if=/dev/sda2" | dd of=~/sda2</strong><br />
kbechler@lupus's password:<br />
4116480+0 records in<br />
4116480+0 records out<br />
2107637760 bytes (2.1 GB) copied, 70.9355 seconds, 29.7 MB/s<br />
4116480+0 records in<br />
4116480+0 records out<br />
2107637760 bytes (2.1 GB) copied, 75.0957 seconds, 28.1 MB/s<br />
[kbechler@flame ~]$<br />
</code><br />
Tadam!</p>
<p>W zależności od tego, co tak naprawdę przesyłamy, możemy do kompletu zaprosić jeszcze jakiś kompresor:</p>
<p><code>[kbechler@flame ~]$  <strong>ssh kbechler@lupus "sudo dd if=/dev/sda2 | bzip2 -9" | bzip2 -d | dd of=~/sda2</strong><br />
kbechler@lupus's password:<br />
4116480+0 records in<br />
4116480+0 records out<br />
2107637760 bytes (2.1 GB) copied, 74.1963 seconds, 28.4 MB/s<br />
ex4116480+0 records in<br />
4116480+0 records out<br />
2107637760 bytes (2.1 GB) copied, 107.966 seconds, 19.5 MB/s<br />
[kbechler@flame ~]$<br />
</code><br />
W sumie tyle :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2011/10/jak-przeslac-dane-ze-zdalnego-systemu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Identyfikacja podatności</title>
		<link>http://konrad.bechler.pl/2011/08/openvas-nessus-retina-vulnerability/</link>
		<comments>http://konrad.bechler.pl/2011/08/openvas-nessus-retina-vulnerability/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 20:58:31 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=431</guid>
		<description><![CDATA[Praca &#8222;informatyka&#8221; nie składa się wyłącznie z klikania i pisania na klawiaturze. Czasami trzeba wyjrzeć zza monitora i zmierzyć się ze światem. A na świecie (przynajmniej tym mnie otaczającym) żyją ludzie zwani audytorami. W szczególności często spotykaną przeze mnie odmianą tych ostatnich są audytorzy z zakresu szeroko rozumianego IT. Są i mnie męczą. Czemu właściwie [...]]]></description>
			<content:encoded><![CDATA[<p>Praca &#8222;informatyka&#8221; nie składa się wyłącznie z klikania i pisania na klawiaturze. Czasami trzeba wyjrzeć zza monitora i zmierzyć się ze światem. A na świecie (przynajmniej tym mnie otaczającym) żyją ludzie zwani audytorami. W szczególności często spotykaną przeze mnie odmianą tych ostatnich są audytorzy z zakresu szeroko rozumianego IT. Są i mnie męczą. Czemu właściwie nie ma się co specjalnie dziwić &#8211; w końcu ktoś im za to męczenie mojej skromnej osoby płaci. A dlaczego mnie męczą? Ano dlatego, że chcą informacji. Niekoniecznie zależy im na tym, żeby te informacje były w 100% zgodne z rzeczywistością, ale muszą coś do swoich sprawozdań wpisać. I tu zaczyna się lekki kłopot. O ile o strukturze swojej sieci, procedurach dostępu do danych, mechanizmach tworzenia kopii zapasowych mogę powiedzieć dużo, to z raportami testów identyfikacji podatności (ang. <em>vulnerability scan</em>) do tej pory było u mnie dość kiepsko. No bo niby audyty są bardzo ważne i  wszyscy o tym doskonale wiedzą, ale jakoś nikt nie chciał wydać worka pieniędzy na oprogramowanie do przeprowadzania odpowiednich skanów. Tak było do tej pory&#8230;</p>
<p>Ponieważ kilka dni temu zostałem po raz kolejny wymęczony (tym razem za pomocą ankiety) przez audyt, postanowiłem przyjrzeć się sytuacji na rynku skanerów bezpieczeństwa i spróbować coś u siebie w firmie wdrożyć. Do tej pory najlepiej pracowało mi się z <a href="http://www.tenable.com/products/nessus">Nessus</a>em i od niego zacząłem. Program wygląda naprawdę fajnie (z ciekawości przetestowałem sobie nawet bezpłatną wersję &#8222;dla domu&#8221;) i jest jednym z najbardziej popularnych skanerów. Ma tylko jedną wadę &#8211; cena usługi <a href="https://store.tenable.com/?main_page=index&amp;cPath=1">ProfessionalFeed</a> wynosi 1.200 USD rocznie. I nawet pomimo tego, że według mnie Nessus wart jest tych pieniędzy, to jestem dziwnie spokojny, że nie byłoby łatwo przeforsować takiego wydatku. Kolejnym strzałem była <a href="http://www.eeye.com/Products/Retina/Network-Security-Scanner">Retina</a>. Produkt równie dojrzały i uznany, co Nessus, to i cena dość podobna. Co dalej? Kiedyś był SATAN, ale znalazłem tylko coś, co nazywało się <a href="http://www-arc.com/sara/">SARA</a> i nie jest już rozwijane. Kolejną witryną, jaką odwiedziłem była strona domowa projektu <a href="http://www.saintcorporation.com/index.html">SAINT</a>. Niestety, w tym przypadku nie znalazłem nawet konkretnej ceny interesującego mnie produktu. Na tym etapie działania wiedziałem, że mam do wybory trzy produkty, z czego jeden znam, lubię i jest prawdopodobnie najtańszy. Ale to jeszcze nie koniec&#8230;</p>
<p><img src="http://www.openvas.org/pix/OpenVAS-logo.png" alt="OpenVAS logo" class="alignleft size-full" />Nie wiem skąd się tam wziąłem, ale w pewnym momencie moim oczom ukazała się strona domowa projektu <a href="http://www.openvas.org/">OpenVAS</a>. O ile udało mi się zorientować, jest to fork Nessusa, który rozpowszechniany jest na licencji GNU. Składa się z kilku współpracujących ze sobą modułów i zestawu testów, które stanowią o sile tego rozwiązania. Co ciekawe, same testy (Network Vulnerability Tests) napisane są w języku NASL opracowanym dla Nessua &#8211; kolejna rzecz, która mi się spodobała. Postanowiłem zainstalować OpenVASa na jakiejś maszynie i zobaczyć, ile to cudo jest warte. W CentOSie 5.6 instalacja przebiegła bez problemu i po niedługim czasie miałem gotowe rozwiązanie do skanowania swoich zasobów&#8230;</p>
<p>Na razie jestem z odkrycia bardzo zadowolony i w wolnych chwilach staram się tego w jakiś sensowny sposób użyć. Pomimo pewnej &#8222;toporności&#8221; interfejsu (używam Greenbone Security Assistant), wydaje mi się, że zaprzyjaźnię się z OpenVASem na dłużej. Ciekawe tylko, co powiedzą audytorzy, jak zobaczą raporty utworzone w jakimś abstrakcyjnym systemie, który nie jest &#8222;ogólnie uznany przez środowisko&#8221; :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2011/08/openvas-nessus-retina-vulnerability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lokalne repozytorium dla YUMa</title>
		<link>http://konrad.bechler.pl/2010/11/lokalne-repozytorium-dla-yuma/</link>
		<comments>http://konrad.bechler.pl/2010/11/lokalne-repozytorium-dla-yuma/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 14:07:29 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=320</guid>
		<description><![CDATA[Infrastruktura serwerowa w mojej firmie w pewnym momencie zaczęła dość intensywnie rosnąć. W dodatku, wobec wszędobylskich portali i web-serwisów, znaczna część tych systemów działa pod kontrolą CentOSa (Apache wydaje mi się odrobinę bezpieczniejszy i mniej wymagający, niż IIS). Wszystko to wymaga okresowych &#8222;przeglądów&#8221; i instalowania aktualizacji (w moim przypadku głównie ze względu na bezpieczeństwo). Niby [...]]]></description>
			<content:encoded><![CDATA[<p>Infrastruktura serwerowa w mojej firmie w pewnym momencie zaczęła dość intensywnie rosnąć. W dodatku, wobec wszędobylskich portali i web-serwisów, znaczna część tych systemów działa pod kontrolą CentOSa (Apache wydaje mi się odrobinę bezpieczniejszy i mniej wymagający, niż IIS). Wszystko to wymaga okresowych &#8222;przeglądów&#8221; i instalowania aktualizacji (w moim przypadku głównie ze względu na bezpieczeństwo). Niby nie jest to jakoś specjalnie skomplikowane &#8211; wystarczy zalogować się na taką maszynę, uruchomić YUMa, pobrać nowe wersje pakietów i klepnąć &#8222;OK&#8221;. No właśnie, ale czy te wszystkie aktualizacje trzeba za każdym razem pobierać z Sieci? Otóż nie, i zmiana takiego stanu rzeczy nie jest nawet taka bardzo skomplikowana.</p>
<p>Można, na przykład, skorzystać z <a href="http://wiki.centos.org/HowTos/CreateLocalMirror">takiej</a> instrukcji, ale dla mnie jest ona odrobinę za bardzo skomplikowana, poza tym nie przepadam za rsync&#8217;iem.</p>
<p>Alternatywny proces tworzenia własnego repozytorium pakietów w moim przypadku wyglądał tak:</p>
<p><strong>Po pierwsze</strong> &#8211; w katalogu <strong>/mnt/md3</strong> (bo akurat tutaj miałem trochę miejsca)  utworzyłem odpowiednią strukturę katalogów:<br />
<code><strong>[kbechler@sv ~]# <span style="color: #ff0000">tree /mnt/md3/mirror/centos/5.5 -L 2</span></strong><br />
/mnt/md3/mirror/centos/5.5<br />
|-- addons<br />
|   |-- i386<br />
|   `-- x86_64<br />
|-- centosplus<br />
|   |-- i386<br />
|   `-- x86_64<br />
|-- contrib<br />
|   |-- i386<br />
|   `-- x86_64<br />
|-- extras<br />
|   |-- i386<br />
|   `-- x86_64<br />
|-- os<br />
|   |-- i386<br />
|   `-- x86_64<br />
`-- updates<br />
     |-- i386<br />
     `-- x86_64</code></p>
<p><strong>Po drugie</strong> &#8211; napisałem sobie prosty plik, o taki:</p>
<p><code><br />
<strong>[kbechler@sv ~]$ <span style="color: #ff0000">cat /mnt/md3/mirror/centos55.lftp</strong></span><br />
open http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.5<br />
lcd /home/www/html/centos/5.5<br />
echo CENTOS_OS<br />
mirror -e --verbose=3 --parallel=10 os/x86_64 os/x86_64<br />
mirror -e --verbose=3 --parallel=10 os/i386 os/i386<br />
echo CENTOS_ADDONS<br />
mirror -e --verbose=3 --parallel=10 addons/x86_64 addons/x86_64<br />
mirror -e --verbose=3 --parallel=10 addons/i386 addons/i386<br />
echo CENTOS_EXTRAS<br />
mirror -e --verbose=3 --parallel=10 extras/x86_64 extras/x86_64<br />
mirror -e --verbose=3 --parallel=10 extras/i386 extras/i386<br />
echo CENTOS_UPDATES<br />
mirror -e --verbose=3 --parallel=10 updates/x86_64 updates/x86_64<br />
mirror -e --verbose=3 --parallel=10 updates/i386 updates/i386<br />
echo CENTOS_CENTOSPLUS<br />
mirror -e --verbose=3 --parallel=10 centosplus/x86_64 centosplus/x86_64<br />
mirror -e --verbose=3 --parallel=10 centosplus/i386 centosplus/i386<br />
echo CENTOS_CONTRIB<br />
mirror -e --verbose=3 --parallel=10 contrib/x86_64 contrib/x86_64<br />
mirror -e --verbose=3 --parallel=10 contrib/i386 contrib/i386<br />
exit</code></p>
<p><strong>Po trzecie</strong> &#8211; w katalogu /etc/cron.daily utworzyłem skrypt, który wywołuje polecenie:</p>
<p><code>lftp -f /mnt/md3/mirror/centos55.lftp &gt; /var/log/mirror_centos55.log </code></p>
<p><strong>Po czwarte</strong> &#8211; skonfigurowałem Apache&#8217;a na ten maszynie tak, aby link &#8222;<strong>http://sv/centos</strong>&#8221; wskazywał na katalog <strong>/mnt/md5/mirror/centos</strong>.</p>
<p><strong>Po piąte</strong> &#8211; poczekałem, aż skrypt z crona zrobi swoje i na lokalnym serwerze będę miał aktualną kopię wszystkich pakietów. Tutaj drobna uwaga: przy wolnym łączu do internetu trzeba albo sprytnie napisać skrypt do synchronizacji, albo uruchomić tą ostatnią &#8222;z palca&#8221;, a skrypt dopisać do crona po jej zakończeniu. W innym wypadku możemy się natknąć na race-condition, w którym kolejne wywołania &#8222;zazębią&#8221; się ze sobą (o ile pierwsza synchronizacja nie zakończy się w ciągu 24h).</p>
<p><strong>Po szóste</strong> (i ostatnie)  &#8211; poprosiłem wszystkie moje systemy, aby pobierały aktualizacje z nowo utworzonego repozytorium. Polegało to na tym, że wywaliłem standardową zawartość katalogu <strong>/etc/yum.repos.d</strong> i wrzuciłem tam poniższy plik:</p>
<p><code><strong>[kbechler@sv ~]$ <span style="color: #ff0000">cat /etc/yum.repos.d/centos.repo</span></strong><br />
[base]<br />
name=CentOS-$releasever - Base<br />
baseurl=http://sv/centos/$releasever/os/$basearch/<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5<br />
[updates]<br />
name=CentOS-$releasever - Updates<br />
baseurl=http://sv/centos/$releasever/updates/$basearch/<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5<br />
[addons]<br />
name=CentOS-$releasever - Addons<br />
baseurl=http://sv/centos/$releasever/addons/$basearch/<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5<br />
[extras]<br />
name=CentOS-$releasever - Extras<br />
baseurl=http://sv/centos/$releasever/extras/$basearch/<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5<br />
#additional packages that extend functionality of existing packages<br />
[centosplus]<br />
name=CentOS-$releasever - Plus<br />
baseurl=http://sv/centos/$releasever/centosplus/$basearch/<br />
gpgcheck=1<br />
enabled=0<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5<br />
#contrib - packages by Centos Users<br />
[contrib]<br />
name=CentOS-$releasever - Contrib<br />
baseurl=http://sv/centos/$releasever/contrib/$basearch/<br />
gpgcheck=1<br />
enabled=0<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5</code></p>
<p>I to tyle &#8211; od momentu wykonania tego powyżej, wszystkie moje maszyny instalują i aktualizują pakiety z lokalnego repozytorium. Dzięki temu zaoszczędziłem odrobinę ruchu (co akurat nie jest w moim przypadku specjalnie ważne), oraz uprościłem konfigurację samej sieci &#8211; większość z tych maszyn nie &#8222;wystaje&#8221; na zewnątrz i konfiguracja NATa stała się zbędna.</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2010/11/lokalne-repozytorium-dla-yuma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Naprawdę dużo plików</title>
		<link>http://konrad.bechler.pl/2010/11/naprawde-duzo-plikow/</link>
		<comments>http://konrad.bechler.pl/2010/11/naprawde-duzo-plikow/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 20:07:43 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=299</guid>
		<description><![CDATA[Ile plików w jednym katalogu to &#8222;dużo&#8221;? Tysiąc, dwa, pięć? Maksymalna ilość plików, które może zawierać pojedynczy katalog jest zależna od systemu plików, jakiego używamy. I choć wartość ta jest z reguły bardzo duża, to jednak w rzeczywistości już przy dużo mniejszej ilości możemy odczuć drastyczny spadek wydajności. Przykład: Debian służący jako serwer WWW na [...]]]></description>
			<content:encoded><![CDATA[<p>Ile plików w jednym katalogu to &#8222;dużo&#8221;? Tysiąc, dwa, pięć? Maksymalna ilość plików, które może zawierać pojedynczy katalog jest zależna od systemu plików, jakiego używamy. I choć wartość ta jest z reguły bardzo duża, to jednak w rzeczywistości już przy dużo mniejszej ilości możemy odczuć drastyczny spadek wydajności.</p>
<p>Przykład: Debian służący jako serwer WWW na którym miałem okazję ostatnio grzebać. Niestety, webmaster zapomniał, że czasami warto czyścić katalogi, w których serwis zapisuje dane sesji użytkownika. Efekt? Proszę bardzo:<br />
<code>k@m:~/domains/xxx/public_html/cache$ <span style="color: #ff0000"><strong>ls -1 | wc -l</strong></span><br />
<strong>594013</strong><br />
</code>Już samo listowanie takiego katalogu jest bardzo uciążliwe. A co ma powiedzieć serwer, które operuje na zawartych w nim plikach i tworzy kolejne? Po znalezieniu kilku takich &#8222;kwiatków&#8221; przestałem się dziwić, że maszyna działała wyjątkowo niestabilnie. Nawet biedny tar nie był w stanie zrobić kopii bezpieczeństwa takiego katalogu&#8230;</p>
<p>OK, ale co możemy z taką sytuacją zrobić? Po pierwsze spróbować przywrócić normalność, czyli wyrzucić wszystko, co się w tym katalogu znajduje.</p>
<p>Upsssss&#8230;.<br />
<code>k@m:~/domains/xxx/public_html/cache$ <span style="color: #ff0000"><strong>rm ./*</strong></span><br />
<strong>bash: /bin/rm: Lista argumentów za długa<br />
</strong> </code>Chyba ilość plików przeraziła basha :-)</p>
<p>Spróbujmy więc inaczej:</p>
<p><code>k@m:~/domains/xxx/public_html/cache$ <span style="color: #ff0000"><strong>find . -type f | xargs rm</strong></span><br />
<em>[tutaj musimy uzbroić się w cierpliwość]</em></p>
<p>k@m:~/domains/xxx/public_html/cache$ <strong><span style="color: #ff0000">ls -1 | wc -l</span></strong><br />
<strong>0</strong></code></p>
<p>Ta-dam :-)</p>
<p>Po drugie &#8211; grzecznie (ale stanowczo) poprosić webmastera, żeby poprawił swój portal i sprzątał po sobie śmieci.</p>
<p>A po trzecie &#8211; tak na wszelki wypadek &#8211; dorzucić do crona coś takiego:</p>
<p><code>find /home/www/domains/xxx/public_html/cache/* -mtime +10 | xargs rm</code></p>
<p><strong>Konkluzja</strong>: Warto zaznajomić się z poleceniem <a href="http://en.wikipedia.org/wiki/Xargs">xargs</a> i ideą <a href="http://pl.wikipedia.org/wiki/Potok_%28funkcja_pow%C5%82oki%29">potoków</a>, bo czasami narzędzia, które uważamy za podstawowe i uniwersalne, odmawiają współpracy.</p>
<p><span style="color: #0000ff">Mała aktualizacja (rekordu): Inny serwer, ten sam webmaster:<br />
</span> <code><span style="color: #0000ff">e:/home/domains/yyy/public_html/__sessions__# <span style="color: #ff0000"><strong>ls -1 |wc -l</strong><br />
<strong>3125242</strong></span></span><br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2010/11/naprawde-duzo-plikow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Znikające tabele w MySQLu</title>
		<link>http://konrad.bechler.pl/2010/11/znikajace-tabele-w-mysqlu/</link>
		<comments>http://konrad.bechler.pl/2010/11/znikajace-tabele-w-mysqlu/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 21:49:17 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=287</guid>
		<description><![CDATA[Koledzy z firmy wydłubali ostatnio jakiś super-hiper wyczesany portal dla klienta, który oparli na Liferay&#8216;u. Testowali to na jednym z Windowsowych serwerów (z zainstalowanym dla potrzeb testów MySQLem). Testy się udały, portal zaczął prawidłowo działać, więc nadszedł odpowiedni czas na przeniesienie tego na serwery produkcyjne: serwer bazodanowy (MySQL) oraz WWW (tomcat + dodatki). Oba działające [...]]]></description>
			<content:encoded><![CDATA[<p>Koledzy z firmy wydłubali ostatnio jakiś super-hiper wyczesany portal dla klienta, który oparli na <a href="http://www.liferay.com/">Liferay</a>&#8216;u. Testowali to na jednym z Windowsowych serwerów (z zainstalowanym dla potrzeb testów MySQLem). Testy się udały, portal zaczął prawidłowo działać, więc nadszedł odpowiedni czas na przeniesienie tego na serwery produkcyjne: serwer bazodanowy (MySQL) oraz WWW (tomcat + dodatki). Oba działające pod kontrolą CentOSa. Sama platforma z portalem to jeden problem (bo wymaga dość mało popularnych interfejsów do SAPa), który &#8211; szczęśliwie &#8211; udało się w miarę szybko zwalczyć. </p>
<p>Ale natychmiast pojawiła się bardzo dziwna sytuacja. Pomimo tego, że <a href="http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html">mysqldump</a> utworzył (wydawałoby się) poprawną kopię danych, a baza na serwerze produkcyjnym nie zgłosiła zastrzeżeń co do jego poprawności i ochoczo wessała wszystkie podstawione jej dane, to po konfiguracji tego wszystkiego okazało się, że owszem, portal wystartował, ale nie zawiera żadnych informacji używanych podczas testów. Baza jest, użytkownik jest, zalogować się &#8216;z ręki&#8217; można, tabele zawierają wszystko, co powinny, a portal nie działa.</p>
<p>Zajęło nam kilka dni, zanim udało się znaleźć przyczynę dziwnego zachowania. Okazało się, że w zależności od systemu, na jakim został zainstalowany, serwer MySQL nie zawsze bierze pod uwagę wielkość liter w nazwach baz/tabel. Dokładniej jest to opisane <a href="http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html">tutaj</a>. Serwer źródłowy (czyli ten z Windowsem) jest case-insensitive (nieczuły? :-)) z punktu widzenia systemu plików (i mysqldump&#8217;a!), więc wyeksportował nazwy tabel małymi literami. I tak też wciągnął te nazwy Linux. Z tą różnicą, że zapytania z portalu zawierają literki o różnej wielkości (Windowsowi było i tak wszystko jedno, bo nie brał tego pod uwagę) &#8211; i to był nasz problem. Dane owszem, były na swoim miejscu, ale w tabelach, których nazwy składały się wyłącznie z małych liter (zgodnie z tym, co zawierało archiwum utworzone przez mysqldump&#8217;a). A Liferay szukał tabelek nazwanych dużymi literami&#8230; </p>
<p>Ponieważ docelowy serwer bazodanowy został specjalnie skonfigurowany dla potrzeb tego typu portali, to przełączenie bazy w tryb lower_case_table_names=1 (czyli case insensitive) nie ma dla mnie żadnych negatywnych skutków i tak też zrobiłem. Po restarcie bazy (i &#8211; na wszelki wypadek &#8211; ponownym imporcie jej zawartości) wszystko zaczęło działać poprawnie, a dane pojawiły się równie magicznie, jak wcześniej zniknęły :-)</p>
<p>Tak zupełnie szczerze, to nie wiem, ile czasu by mi zajęło szukanie, gdybym nie natknął się na <a href="http://www.liferay.com/community/forums/-/message_boards/message/6148865;jsessionid=4E6AC036937F41D2631FBA12B43DFB32.node-1">ten</a> wpis na forum Liferay&#8217;a.</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2010/11/znikajace-tabele-w-mysqlu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalacja SAP RFCSDK w CentOSie</title>
		<link>http://konrad.bechler.pl/2010/09/instalacja-sap-rfcsdk-w-centosie/</link>
		<comments>http://konrad.bechler.pl/2010/09/instalacja-sap-rfcsdk-w-centosie/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 08:35:03 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sap]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=281</guid>
		<description><![CDATA[Paczkę z potrzebnymi binarkami możemy pobrać spod adresu http://service.sap.com/swdc. Niestety, żeby się tam dostać trzeba mieć konto dostępowe. Na początek kilka słów o tym, jak znaleźć odpowiedni pakiet. W przypadku SAPa nic nie jest oczywiste, więc nawet z pobieraniem oprogramowania można mieć pewne problemy. Przede wszystkim musimy określić, jaka właściwie wersja będzie nam potrzebna. Z [...]]]></description>
			<content:encoded><![CDATA[<p>Paczkę z potrzebnymi binarkami możemy pobrać spod adresu <a href="http://service.sap.com/swdc">http://service.sap.com/swdc</a>. Niestety, żeby się tam dostać trzeba mieć konto dostępowe.</p>
<p>Na początek kilka słów o tym, jak znaleźć odpowiedni pakiet. W przypadku <a href="http://www.sap.com">SAP</a>a nic nie jest oczywiste, więc nawet z pobieraniem oprogramowania można mieć pewne problemy. Przede wszystkim musimy określić, jaka właściwie wersja będzie nam potrzebna. Z pomocą przychodzi notka o numerze 825494. Ponieważ aktualnie mam zamiar to instalować na CentOSie 5.4 w wersji 32-bitowej, potrzebuję RFCSDK w wersji 6.40 lub 7.00 (przynajmniej tak wynika ze wspomnianej noty). Teraz zaglądamy do noty numer 413708. Mamy tu ładnie opisane gdzie, co i w jakiej kolejności kliknąć, żeby dojść do miejsca z którego możemy sobie pożądane rzeczy pobrać. Oczywiście z rzeczywistością ma to niewiele wspólnego :-) Jak już znajdziemy to, co nas interesuje, to możemy kliknąć &#8222;download&#8221; i przy odrobinie szczęścia po chwili będziemy posiadaczami wymarzonego pakietu.</p>
<p>Następnym krokiem jest rozpakowanie pliku, który pobraliśmy. Potrzebne jest do tego narzędzie SAPCAR. Do pobrania z serwisu SAP. Tutaj jest trochę łatwiej. Przebijamy się przez menu, aby dojść do miejsca &#8222;Search for Support Packages and Patches&#8221; i w polu &#8222;Search&#8221; wpisujemy &#8222;SAPCAR&#8221;. Klikamy na odpowiednią wersję, wybieramy platformę i pobieramy pakiet. Co ciekawe, wersja dla Linuksa także ma rozszerzenie .exe, ale jest to najzwyklejsza binarka w formacie <a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF</a>.</p>
<p>Dobra, mamy dwa upragnione pliki i coś z nimi teraz trzeba zrobić. Na początek zmieńmy atrybuty sapcara:<br />
<code>chmod 755 ./SAPCAR_0-10003688.exe</code><br />
Tutaj drobna uwaga: Jeżeli próba uruchomienia tego ostatniego spowoduje wywalenie błędu <code>"./SAPCAR_0-10003688.exe: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory"</code> to oznacza, że musimy doinstalować pakiet zgodności o nazwie &#8222;<strong>compat-libstdc++-33</strong>&#8222;.</p>
<p>Rozpakowujemy archiwum z instalką RFCSDK:<br />
<code>./SAPCAR_0-10003688.exe -xvf ./RFC_25-10004432.SAR</code></p>
<p>W wyniku dostajemy katalog rfcsdk, który trzeba gdzieś skopiować. Na przykład do /usr/sap.<br />
Żeby to wszystko chciało działać, musimy jeszcze utworzyć plik <strong>sap.conf</strong> w katalogu <strong>/etc/ld.so.conf.d</strong> i wpisać do niego dwie linijki:<br />
<code>/usr/sap/rfcsdk/lib<br />
/usr/sap/lib<br />
</code></p>
<p>Wywołanie <strong>sapinfo</strong> powinno dać w wyniku mniej-więcej coś takiego:</p>
<p><code>[kbechler@sv bin]$ /usr/sap/rfcsdk/bin/sapinfo -v<br />
This RFC library belongs to the SAP R/3 Release *** 700,0,239  ***<br />
Versions of SAP internal libraries:<br />
  dptr:    2<br />
  ni  :   38<br />
  cpic:    3<br />
  rfc :    3<br />
Compiled by compiler version:<br />
  3.3.3 (SuSE Linux)<br />
[kbechler@sv bin]$</code></p>
<p>Ale po co to wszystko? Ano po to, żeby móc monitorować systemy SAP za pomocą <a href="http://www.nagios.org/">Nagios</a>a i <a href="http://exchange.nagios.org/directory/Plugins/Business-Management-and-Logic/SAP/Check-SAP-Availability-and-Response-Time/details">tego</a> skryptu(1).</p>
<p>Skrypt wywołuje się mniej-więcej tak:</p>
<p><code>[kbechler@sv /]# /usr/lib/nagios/plugins/check_sap_rfcping.pl -a 192.168.0.1 -s 10 -w 50 -c 200<br />
RFCPING OK - No Problems found, AvgRTT=1 ms (SAPF001_SF1_10)<br />
[kbechler@sv /]#<br />
</code></p>
<p><em><strong>Konfiguracja Nagiosa:</strong></em></p>
<p>do pliku &#8216;<strong>commands.cfg</strong>&#8216; dodałem wpis:</p>
<p><code>define command{<br />
    command_name check_sap_rfcping<br />
    command_line $USER1$/check_sap_rfcping.pl -a $HOSTADDRESS$ -s $ARG1$ -w 50 -c 200<br />
    }<br />
</code></p>
<p>Potem zdefiniowałem serwis, który będzie monitorował PINGa:<br />
<code>define service{<br />
        use                     generic-service<br />
        host_name               sap_sandbox1<br />
        service_description     SAP RFC PING<br />
        check_command           check_sap_rfcping!10!-w 100 -c 300<br />
        }<br />
</code></p>
<p>I to w zasadzie wszystko. Ruszyło za pierwszym razem (co w IT zdarza się niekoniecznie zawsze ;-))</p>
<p>(1) Żeby skrypt działał, musimy jeszcze pobawić się trochę w linkowanie katalogów: <code>'ln -s /usr/sap /usr/local/sap'</code></p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2010/09/instalacja-sap-rfcsdk-w-centosie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CentOS, Firefox i Java</title>
		<link>http://konrad.bechler.pl/2010/07/centos-firefox-i-java/</link>
		<comments>http://konrad.bechler.pl/2010/07/centos-firefox-i-java/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 20:15:43 +0000</pubDate>
		<dc:creator>konrad</dc:creator>
				<category><![CDATA[centos]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rpm]]></category>

		<guid isPermaLink="false">http://konrad.bechler.pl/?p=271</guid>
		<description><![CDATA[Jakoś tak się składało, że przez naprawdę długi czas Linux stanowił dla mnie niemalże wyłącznie platformę serwerową, gdzie konsola była w zupełności wystarczająca. Wobec takiego stanu rzeczy, cały rozwój tego systemu związany ze środowiskiem graficznym mnie, delikatnie pisząc, ominął. Obecnie zacząłem trochę &#8216;eksperymentować&#8217; z graficznym Linuksem i natykam się na dziwne &#8211; jak dla mnie [...]]]></description>
			<content:encoded><![CDATA[<p>Jakoś tak się składało, że przez naprawdę długi czas Linux stanowił dla mnie niemalże wyłącznie platformę serwerową, gdzie konsola była w zupełności wystarczająca. Wobec takiego stanu rzeczy, cały rozwój tego systemu związany ze środowiskiem graficznym mnie, delikatnie pisząc, ominął. Obecnie zacząłem trochę &#8216;eksperymentować&#8217; z graficznym Linuksem i natykam się na dziwne &#8211; jak dla mnie &#8211; problemy. Przykładowo&#8230;</p>
<p>Jak zmusić Firefoksa pod CentOSem do współdziałania z Javą? Okazuje się to nie być aż tak trywialnym zadaniem, jak by się wydawało (czyli kliknąć, potwierdzić i mieć). Zainstalowałem sobie dość standardowego CentOSa, wyposażonego w pełnowartościowy system graficzny kontrolowany przez GNOMEa. Okazało się, że Firefox jako taki był sam z siebie. Ale nie bardzo, <a href="http://pl.wikipedia.org/wiki/OOTB">OOTB</a>, wspierał Javę.</p>
<p>Po pierwsze pobrałem najnowszą wersję <a href="http://java.com/pl/download/linux_manual.jsp?locale=pl&amp;host=java.com">JRE</a> w wersji &#8222;Linux RPM&#8221;. Co ciekawe, plik, który udało mi się sciągnąć okazał się &#8222;prawie&#8221; RPMem. Niby w środku RPM, ale dodatkowo opakowany kawałkiem skryptu BASH:<br />
<code>[root@h7-centos ~]# file ./jre-6u20-linux-i586-rpm.bin<br />
./jre-6u20-linux-i586-rpm.bin: Bourne shell script text executable<br />
</code><br />
Po uruchomieniu &#8222;instalatora&#8221; najpierw wyświetliło licencję, potem się samo rozpakowało a na koniec powiedziało &#8222;Done.&#8221; :-)</p>
<p>Problem w tym, że wprawdzie Java się niby zainstalowała, ale Firefox jakby nie załapał, że powinien z niej w jakikolwiek sposób skorzystać i w dalszym ciągu marudził, że nie rozumie. Nic to, nie zrażony pierwszym niepowodzeniem, zacząłem szukać, jak to wszystko zmusić do współdziałania. Może cała procedura (nota bene składająca się z jednego polecenia :-)) nie jest jakoś porażająco skomplikowana, ale tak zupełnie oczywista dla mnie na początku też nie była.</p>
<p>Po krótkich poszukiwania okazało się, że Firefox szuka swoich pluginów w dwóch katalogach:<br />
- globalnym, który wpływa na zachowanie przeglądarkidla wszystkich użytkowników korzystających z danego systemu: <strong>/usr/lib/mozilla/plugins</strong>,<br />
- lokalnym użytkownika: <strong>~/.mozilla/plugins</strong>.</p>
<p>Aby pożenić Firefoksa ze świeżo zainstalowaną przeze mnie Javą, musiałem utworzyć dowiązanie symboliczne (w katalogu, w którym FF szuka pluginów) do odpowiedniej binarki Javy. Wyglądało to tak:<br />
<code>[root@h7-centos ~]# <strong>cd /usr/lib/mozilla/plugins</strong><br />
[root@h7-centos plugins]# <strong>ln -s /usr/java/default/lib/i386/libnpjp2.so ./</strong><br />
[root@h7-centos plugins]# <strong>ls -la libnpj*</strong><br />
lrwxrwxrwx 1 root root 38 lip  2 22:06 libnpjp2.so -&gt; /usr/java/default/lib/i386/libnpjp2.so<br />
[root@h7-centos plugins]#<br />
</code><br />
Po restarcie Firefoksa, program nagle zaczął rozumieć Javę i chyba ją nawet trochę polubił :-)</p>
<p>P.S. Dokładnie tak samo należy postąpić z niedziałającym Flashem, linkując do znanego nam już katalogu plik <strong>/usr/lib/flash-plugin/libflashplayer.so</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://konrad.bechler.pl/2010/07/centos-firefox-i-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

