Archive

Posts Tagged ‘Ubuntu’

A short story of a failed installation (WebSphere Message Broker on Ubuntu)

February 18th, 2011 Dariusz Suchojad 3 comments

So I’ve just spent three hours on trying to install the WebSphere Message Broker 7.0 (CZ4VEML) on Ubuntu 10.10 and it seems the current state of the affairs is really sorry. Had the installer been a normal set of DEBs or RPMs, I would’ve had no problems with it, but instead IBM had chosen to make it a Java, an Eclipse-based, one. Sorry guys, but being written in Java doesn’t help at all, why should it. Besides, maybe users don’t mind having to install dozens of JREs and Eclipse instances but people certainly do mind it.

So what went wrong anyway? Frankly, I don’t know. I’ve prepared everything on MQ side, created the necessary users and groups and then run the installer using the -console switch (again, the convention for long options is to use –console, that’s two dashes). It went just fine, stopped at 100%, said it was a pleasure to be executed (OK, not that exactly :-) ) and I thought that was all.

Well, not really.

After typing “mqsicreatebroker MB01 -q QM01″ I was greeted with a “BIP8011E: Unable to create the components configuration data.” error and its oh-so-helpful explanation “Ensure that the userid that is running this command has adequate authority to update the configuration or registry files.” That’s a designing user interfaces 101 guys, really. How can you possibly mention any configuration and registry files in error messages if the very concept hasn’t been defined anywhere in the documentation? How am I supposed to know what files you are talking about?! About the only registry that springs to mind is stuff you modify through the mqsichangeproperties command, but I have no idea if that’s what the author had in mind. I can – though I’d rather didn’t – pretend I didn’t see that in the installation guide you say “SELinux is not supported” (how is that making the planet a safer place) but on seeing such an error all I can do is to chmod 777 the whole system and hope it’s going to help.

After a while it turned out there was a guy who had the same problem some time ago and indeed, when I took a look at /var/mqsi it looked a bit strangely, like if the installer forgot to install half of the stuff it was supposed to put there.

So being an adult, what I did next was to have a look at that installer thing, the one written in Eclipse. I unzipped the setup.jar and saw a bunch of MD5 hashes of names pointing to who-knows-where on the file system. Each of the files had a 78 9C header so it was obvious these were the missing files, compressed with zlib. I unpacked one of them and it seemed fine, if only I’d known where they were to go, which one belonged to /var/mqsi! Just compare it with the wealth of information regarding normal package formats.

OK, so I thought maybe I could somehow put the damn thing into a debug mode so that it started logging what it was really doing. Amazingly, there was a wizard.xml file which contained interesting entries like “eventsLogged”, “logEchoedToScreen” or “optionalLogOutput” – ah, and while we’re at it, please don’t invent your own logging levels, my heart cringes when I see things like “wrn”, what is it, are we running out of vowels? How do you expect me to use a debug level? Should it be “dbg”, “dbug” or what? So anyway, I modified the file according to my best telepathic skills hoping it would be the right incantation and I would finally see why the files weren’t being installed but then when I started the installer I hit upon a “The wizard cannot continue because of the following error: wizard file has changed since it was created” message which was the last straw I’ve had enough at that point, here I am trying some obscure magick just to install this software but no, I’m not even supposed to peek under the covers because of what, really? Has any of you, authors, even bothered to ask the question of what you’re hiding and from whom?

So that’s how it looks like right now. I’m sure in some time the situation will change – and I honestly would like to help you out with it but I’m merely a user so what do I know, I can only wait for a miracle, but when it has I’ll be sure to blog about how to install the Message Broker on Ubuntu – it’s just it’s nothing to be proud of as of today. Too bad it couldn’t have gone as smoothly as with the WebSphere MQ installation which I covered some time ago.

Share

WebSphere MQ and Ubuntu HOWTO

July 3rd, 2010 Dariusz Suchojad 6 comments

(Update Jan 22, 2011 – I’ve just reproduced all the steps below on a fresh Ubuntu 10.10 install)

Until IBM finally recognizes that Ubuntu is the most popular Linux distribution and starts offering WebSphere MQ DEBs to install, here’s a small HOWTO which will guide you through the installation process. I’m using Ubuntu 9.10 and MQ 7.0.1 (CZ4VEML), both 64-bits, but it’s something I’ve been using since at least Ubuntu 7.04  I think, so it will work reliably with other versions of Ubuntu and MQ as well.

Installation

First untar the CZ4VEML.tar.gz archive and then install rpm and sharutils packages:

dsuch$ sudo apt-get install rpm sharutils

Next try executing the ./mqlicense.sh script which will most probably fail horribly but that’s OK, we’ll work around it

dsuch$ sudo ./mqlicense.sh

Accept the license if it doesn’t end with an error such as the one below ..

Exception in thread "main" java.lang.UnsatisfiedLinkError: fontmanager
(libstdc++.so.5: cannot open shared object file: No such file or directory)

.. but if it does, just read the license carefully

dsuch$ less ./licenses/LA_en

I’m assuming the script has failed but if you take a look at it closely you’ll notice that all it does in the end is to create a /tmp/mq_license/license/status.dat file, so we’ll do the same ourselves a couple of times.

Now comes the runtime, preceded by the manual creation of the file which ./mqlicense.sh failed to create.

dsuch$ sudo mkdir -p /tmp/mq_license/license/
dsuch$ sudo touch /tmp/mq_license/license/status.dat
dsuch$ sudo rpm -iavh --nodeps --force-debian
./MQSeriesRuntime-7.0.1-0.x86_64.rpm

.. more RPMs to install ..

dsuch$ sudo mkdir -p /tmp/mq_license/license/
dsuch$ sudo touch /tmp/mq_license/license/status.dat
dsuch$ sudo rpm -iavh --nodeps --force-debian ./MQSeriesJava-7.0.1-0.x86_64.rpm
./MQSeriesClient-7.0.1-0.x86_64.rpm ./MQSeriesServer-7.0.1-0.x86_64.rpm
./MQSeriesSDK-7.0.1-0.x86_64.rpm ./MQSeriesSamples-7.0.1-0.x86_64.rpm
./MQSeriesTXClient-7.0.1-0.x86_64.rpm
 

.. and the last batch of RPMs ..

dsuch$ sudo mkdir -p /tmp/mq_license/license/
dsuch$ sudo touch /tmp/mq_license/license/status.dat
dsuch$ sudo rpm -iavh --nodeps --force-debian  ./MQSeriesMan-7.0.1-0.x86_64.rpm
./MQSeriesKeyMan-7.0.1-0.x86_64.rpm 

The newly created mqm user would sure like to use Bash by default ;-)

dsuch$ sudo usermod -s /bin/bash mqm

That’s all there is to installing, let’s send some messages now.

Verifying the installation

First change the user to mqm ..

dsuch$ sudo su - mqm

.. and create & start a QM01 queue manager:

mqm$ crtmqm QM01
mqm$ strmqm QM01

Let’s define a Q1 local queue for testing

mqm$ runmqsc QM01

Now cd to /opt/mqm/samp/bin/ which holds various precompiled utilities among which are amqsput and amqsget. By the way, the source code is in /opt/mqm/samp.

Send two messages to the Q1 queue on the QM01 queue manager and quit amsqput with Ctrl-C:

mqm$ ./amqsput Q1 QM01
Sample AMQSPUT0 start
target queue is Q1
123
zxc
^C

Now let’s use amqsget to get the messages off Q1 queue and quit with Ctrl-C again, as you can see, there are 2 messages sent there in the previous step:

mqm$ ./amqsget Q1 QM01
Sample AMQSGET0 start
message <123>
message <zxc>
^C

Removing WebSphere MQ

Use those three commands if for some reason you need to remove MQ from your system.

dsuch$ sudo rpm -qa | grep "MQSeries" | xargs sudo rpm -e --force-debian --noscripts
dsuch$ sudo rm -rf /var/mqm
dsuch$ sudo userdel mqm

That’s all folks, the rest is in the MQ documentation, using MQ on Ubuntu is in no way different to what RHEL has to offer, it’s simply Linux and everything works just fine. Except for the installer :-)

Share
Categories: Software Tags: ,

Make mc remember the last directory

June 16th, 2010 Dariusz Suchojad No comments

This is mostly so I don’t forget about it myself.. when installing Ubuntu, don’t forget to add this line to ~/.bashrc and have Midnight Commander remember the last directory you were in on exit instead of taking you back to the one you were in when you typed mc in the shell:

source /usr/share/mc/bin/mc.sh
Share
Categories: Software Tags:

Prosty przykład nieklarownego procesu developmentu

September 12th, 2009 Dariusz Suchojad No comments

Spędziłem sobie właśnie kilka godzin na szukaniu błędu w kodzie, po czym okazało się, że błąd był w kodzie biblioteki, z której korzystałem, i błąd ten występuje tylko w trunku SVN-owym tejże biblioteki. Oczywiście są dwie szkoły, “kod w trunku może nie kompilować się/nie działać, stabilne są branche” i “cały rozwój jest w branchach, a trunk musi się kompilować/działać”. Osobiście jestem z tej drugiej szkoły, ale to nie ma znaczenia, ważne jest to, żeby dokumentować to, co się wybrało, proces musi być jasny. Wystarczy krótka informacja na stronie projektu w sekcji “For developers” i zaoszczędzi się innym sporo czasu. Jeśli ktoś ma ochotę na inne dobre rady na temat prowadzenia projektów i community, w szczególności opensource’owych, to zachęcam do przeczytania książki The Art of Community, napisanej przez community managera Ubuntu, bardzo pouczająca lektura.

W trakcie szukania błędu przeczytałem przy okazji release notes dla WebSphere MQ 7.0 i rozbawiła mnie informacja na temat JMS-owych bundli OSGi WMQ “The OSGi bundles shipped with WebSphere MQ classes for JMS client are not working.” Krótko i na temat. Nie mamy Pańskiego płaszcza i co nam Pan zrobi. ;-)

Share
Categories: Software Tags: , ,

AppArmor i Enterprise Architect

March 21st, 2009 Dariusz Suchojad No comments

Na swoim Ubuntu używam Enterprise Architecta uruchamianego pod Wine. Pomimo tego, że lubię EA to jednak nie mam zbyt wielkiej nadziei na to, że Sparx Systems udostępni wersję opensource’ową w najbliższej przyszłości. Nie mam dostępu do źródeł EA, więc podwójnie nie mogę wierzyć temu jak ten program działa. Szczęśliwie, dzięki AppArmor, możliwe jest ograniczenie dostępu EA do wskazanych zasobów systemu, dzięki czemu wiem, że EA nie zagląda niepotrzebnie do ~/.ssh, /sbin czy innych miejsc, które – według mnie – nie są EA potrzebne do szczęścia.

Odkładając jednak na bok historie o koniach trojańskich wprowadzanych celowo przez producentów popularnego oprogramowania bez dostępu do źródeł, warto podejść do kwestii EA bardziej systematycznie i odpowiedzieć sobie na pytania, które stawia autor tej książki.

  1. Co właściwie chcę ochronić?
    • Chcę ochronić prywatne dane swoje i swoich klientów, które znajdują się w systemie i podlegają przetwarzaniu przez EA. Dodatkowo chcę ochronić sam system – binaria, biblioteki, pliki konfiguracyjne itp.
  2. Jakie są zagrożenia dla zasobów, które chcę ochronić?
    • Ze strony EA nie przewiduję większych kłopotów, nie przewiduje celowych niecnych działań. Bardziej obawiam się tego, że EA nie był projektowany do pracy z Linuksem i może niechcący żądać dostępu do prywatnych danych oraz do innych core’owych zasobów systemu. Dane te i zasoby mogłyby być np. cache’owane przez EA w swoich strukturach danych (w plikach konfiguracyjnych, bazach z projektami) przez co mogłyby niechcący wyjść poza mój system gdybym np. chciał komuś wysłać swój projekt .EAP. Inną kwestią jest to, że EA nie podlega w żaden sposób aktualizacji oprogramowania takiej jak wszystkie inne aplikacje Ubuntu – nie jest instalowany jako pakiet Ubuntu więc informacje o nowych wersjach EA otrzymuję z opóźnieniem. Może więc zdarzyć się sytuacja, że będzie istniał exploit dla EA, który będzie można uruchomić w moim systemie pomimo tego, że reszta systemu będzie na bieżąco aktualizowana. Exploit ten mógłby pozwolić na wydostanie się przez sieć z systemu np. danych dotyczących projektów dla klientów.
  3. Na ile dobrze proponowane przeze mnie rozwiązanie chroni zasoby?
    • AppArmor jest dojrzałym rozwiązaniem stosowanym w o wiele bardziej zaawansowanych scenariuszach serwerowych i  otoczenie EA przez AppArmor oznacza użycie części możliwości AA. AppArmor ma wszystkie te możliwości, na których mi zależy – pozwala na wskazanie, do których zasobów może lub nie może mieć dostęp EA. Używam standardowej, sprawdzonej, funkcjonalności AA.
  4. Jakie zagrożenia wprowadza proponowane rozwiązanie?
    • Wprowadzam do systemu nowy element – AppArmor chroniący EA – istnieje więc ryzyko, że zmiany które wprowadzam same będą zawierały błędy, że AppArmor będzie zawierał błędy, które negatywnie wpłyną na bezpieczeństwo i zabezpieczenia systemu. Nie przewiduję zagrożeń związanych z tym, że zwiększy się poziom skomplikowania interakcji EA oraz Wine z resztą systemu, ostatecznie po to chcę wprowadzić AppArmor, aby ograniczyć, a nie zwiększyć, kontakty EA i Wine z pozostałymi elementami systemu.
  5. Jakie są koszty wprowadzonego rozwiązania?
    • Podstawowym kosztem jest czas poświęcony na utworzenie i utrzymanie odpowiedniej konfiguracji AppArmor. EA jest relatywnie małą aplikacją, więc kilka godzin wystarczy na utworzenie początkowej konfiguracji. Konfiguracja, na której mi zależy powinna być ścisła, chcę więc ograniczyć dostęp EA do konkretnych wersji bibliotek potrzebnych do działania – wiąże się więc z tym to, że przy zmianach wersji bibliotek (np. nowa wersja X-a, upgrade do nowszej wersji Ubuntu) potrzebne będą zmiany w konfiguracji AppArmor, przewiduję, że zajmie to także kilkadziesiąt minut miesięcznie. Kosztem jest także konieczność aktualizacji AppArmor do nowszych wersji – to jednak odbywa się automatycznie, Ubuntu pobiera nowe wersje oprogramowania do instalacji i pyta mnie o zgodę na instalację, nie zajmuje to więcej niż kilkanaście minut miesięcznie. Inną sprawą jest zapotrzebowanie AA na zasoby sprzętowe (procesor i miejsce na dysku), aczkolwiek te są bardzo małe i praktycznie niezauważalne przy wszystkich innych zainstalowanych aplikacjach.
  6. Czy warto wprowadzić proponowane zabezpieczenia aby zminimalizować zagrożenia, biorąc pod uwagę koszty, które muszę ponieść oraz zagrożenia, które mogą zostać wprowadzone?
    • Pomimo tego, że nie przewiduję, aby zagrożenia ze strony EA były duże to koszty, które muszę ponieść, oraz zagrożenia ze strony AA są jeszcze mniejsze – tak, warto wprowadzić proponowane zabezpieczenia.

Skoro już podjąłem decyzję o użyciu AA, to musimy utworzyć profil Enterprise Architecta dla AppArmor, który będzie zawierał reguły mówiące AA na co pozwalamy Enterprise Architectowi. Profile AA rozszerzają, nie zastępują, standardowe uprawnienia UNIX-owe do zasobów systemu. Nadal więc występują rwx, setuid, sticky bit i przyjaciele, ale dodatkowo AA pozwala na ściślejsza kontrolę dostępu.

AppArmor operuje na ścieżkach do plików – trzeba wskazać, który program chcemy audytować podając właśnie jego ścieżkę. Ponieważ EA jest uruchamiany pod Wine, to AA nie widzi tak naprawdę EA tylko Wine. Na przyklad, u mnie na pulpicie ikonka EA uruchamia takie polecenie:

env WINEPREFIX="/home/dsuch/.wine" wine "C:\Program Files\Sparx Systems\EA\EA.exe"

więc dla AA programem, który jest uruchomiony, nie jest EA tylko Wine.

Nie chcę utworzyć profilu dla całego Wine’a, tylko dla EA, potrzebujemy w takim razie małego wrappera, skryptu shellowego, który opakuje nam EA wywoływane pod Wine i będzie miało swoją unikalną ścieżkę, którą będzie można audytować. Wrapper ten  u mnie jest umieszczony w /home/dsuch/bin/ea.sh i ma taką postać:

wine ~/.wine/drive_c/Program\ Files/Sparx\ Systems/EA/EA.exe

Taki skrypt można już potraktować poleceniem aa-genprof. Jak czytamy w manualu (man aa-genprof), program ten wspomaga tworzenie profili dla AA. To co zrobi aa-genprof, to utworzenie pustego profilu dla wrappera /home/dsuch/bin/ea.sh, zaznaczenie w logu auditd (domyślnie /var/log/audit/audit.log) albo w  /var/log/messages, że rozpoczyna się proces tworzenia profilu, aktywowanie profilu w trybie complain (nauki), a następnie aa-genprof będzie czekał aż pochodzę sobie po EA, cały czas rejestrując w logu do jakich zasobów dostępu żąda EA. Gdy już skończę pracować z EA, aa-genprof zada mi serię pytań – nad którymi warto zastanowić się – na temat tego, czy EA faktycznie powinien mieć dostęp do zasobów, z których korzystał. Profile są prostymi plikami tekstowymi o określonej składni, można więc dodatkowo tune’ować je manualnie, już po ich utworzeniu. Skończony profil można uruchomić w trybie enforce, co spowoduje, że AppArmor zacznie stosować reguły zdeklarowane w profilu.

Do samego aa-genprof, jak i do innych toolsów z rodziny AppArmor istnieje dobra dokumentacja, spójrzmy więc na ostateczny profil, który można pobrać tutaj.

Pierwszą rzeczą, którą trzeba zauważyć jest to, że profil zawiera subprofil dla Wine. Ma to sens, ponieważ wrapper uruchamia Wine w podprocesie, i chcemy w profilu określić jakie możliwości powinien lub nie powinien mieć Wine uruchamiany w kontekście tego konkretnego wrappera, dlatego właśnie profil wrappera zawiera subprofil Wine.

Profil wrappera zawiera 3 polecenia:

  • #include <abstractions/base> – includuje wszystkie reguły z /etc/apparmor.d/abstractions/base do bieżącego profilu (do profilu wrappera /home/dsuch/bin/ea.sh). Dzięki includowaniu można wyodrębnić sobie zestaw reguł wspólnych dla różnych profilowanych aplikacji
  • owner @{HOME}bin/ea.sh r, – pozwala w ogóle na odczyt skryptu. Bez tej reguły, pomimo tego, że w sensie uprawnień UNIX-owych jestem właścicielem /home/dsuch/bin/ea.sh i wrapper ma odpowiednie aytrybuty (-rwx——), to jednak nie mogę odczytywać tego skryptu.
    • Chwili uwagi wymaga też alias @{HOME}. Mamy do niego dostęp dzięki użyciu #include <tunables/global> na samej górze profilu, który z kolei includuje między innymi /etc/apparmor.d/tunables/home, w którym to pliku określone jest gdzie w naszym systemie znajdują się katalogi domowe użytkowników. W razie gdyby ktoś w swoim systemie stosował nie /home, ale np. /export/home, to może tam wskazać lokalizację katalogów domowych użytkowników. Dzięki temu w profilach możemy właśnie pisać @{HOME} a nie /home. Po prostu kolejna warstwa abstrakcji.
    • Z kolei prefiks owner mówi AA, żeby sprawdzić, że jestem właścicielem pliku @{HOME}bin/ea.sh – mogłoby zdarzyć się tak, że istniałby w systemie /home/gucio/bin/ea.sh, który miałby swój profil AA taki sam jak mój, i dzięki użyciu prefiksu owner AA nie pozwoliłby mi na uruchomienie wrappera Gucia, nawet gdyby wrapper Gucia miał ustawiony atrybut o+x, który standardowo pozwoliłby mi na jego uruchomienie.
  • /usr/bin/wine cx, – pozwala wrapperowi na uruchomienie Wine’a (flaga x), oraz mówi, że istnieje subprofil dla Wine’a uruchamianego w ramach aktualnego profilu (flaga c, czyli child).

Na tym kończy się profil dla samego wrappera, dalej w profilu pojawia się subprofil, który określa do czego ma dostęp Wine uruchamiany z poziomu wrappera. Subprofil celowo jest wybitnie restrykcyjny i wskazuje na konkretne wersje bibliotek, z których może korzystać Wine uruchamiający EA. Subprofil można podzielić na kilka części:

  • Podstawowe zależności – tutaj nie ma wielkiego wyboru, trzeba pozwolić na ich uruchomienie, są to core’owe komponenty, które przewijać się mogą w większości aplikacji (ld, libc, libpthread itp.)
  • Fonty – cóż, fonty na pewno są potrzebne w aplikacji okienkowej. Nie miałem pojęcia, że w aż tyle miejsc trzeba zajrzeć, żeby aplikacja miała dostęp do fontów.
  • Locale – no tak, locale na pewno są potrzebne.
  • X + keymapa – także przyda się w aplikacji okienkowej :-)
  • Wine, core + biblioteki – tu też nie ma wyboru, Wine nie jest mały, trzeba pozwolić na uruchomienie kilku podprocesów i wczytanie bibliotek.
  • Wine, zasoby z pseudodysku C: – kolejne zależności Wine, tym razem bliższe systemowi Windows.
  • /proc/cpuinfo i /proc/meminfo – potrzebne Wine do szczęścia.
  • Ustawienia EA – tutaj dopiero zaczynają się ustawienia specyficzne dla EA. Nie ma wyboru, trzeba pozwolić EA na zajrzenie i wczytanie swoich własnych danych i bibliotek.
  • Różne – tutaj nie ma nic ciekawego, nie ma też co dziwić się, że jest potrzebny dostęp do /etc/passwd, w jakiś sposób aplikacja musi sprawdzić gdzie np. jest mój katalog domowy. Wywołuje więc polecenie systemowe, które zagląda do /etc/passwd, odczytuje lokalizację mojego $HOME i zwraca wynik do aplikacji. Hasha i salta hasła w /etc/passwd i tak przecież nie ma.
  • Ustawienia specyficzne dla moich projektów – wszystkie projekty, które wymagają jakichkolwiek diagramów UML, znajdują się w podkatalogach katalogu /home/dsuch/projects/, EA musi więc mieć dostęp do odczytu do tych podkatalogów. Dodatkowo, same projekty .eap przechowywane są zawsze w katalogach o nazwie “doc”, EA powinien mieć więc możliwość zapisywania do swoich plików i zakładania locka na pliku .ldb (flaga k oznacza granta na zakładanie locka na danym pliku).
  • Zasoby, do których uprawnienia EA odebrałem – tu jest ciekawiej. Zasoby te można podzielić na trzy kategorie:
    • kryptobiblioteki – być może byłyby potrzebne gdybym EA dopiero instalował, np. EA potrzebowałby ich do sprawdzenia kluczy licencyjnych. Właściwie to jest dość pozytywne, że EA chce korzystać z możliwości krypto, które oferuje dany system a nie z własnych “innowacji”. Inna sprawa to to, że nie mam dostępu do źródeł EA, więc nie wiem na ile solidnie jest cała kryptografia w EA wykonana.
    • dostęp do sieci – to nie powinno być potrzebne. Nie mam pojęcia dlaczego, ale EA chciał koniecznie otwierać sockety TCP. Używam EA w wersji Professional Edition, nie łączę się więc z żadnymi bazami danych i nie chcę, aby EA otwierał jakiekolwiek połączenia. Z pewnością jest to sprawa do zgłoszenia do supportu SparxSystems, zobaczymy co support na to powie.
    • lista urządzeń SCSI (/proc/scsi/scsi) – teoretycznie nic groźnego, ale jeśli wszystko działa poprawnie bez tego to nie ma potrzeby nadawać takich uprawnień. To też jest sprawa dla supportu.

Na tym kończy się mój profil AppArmor dla Enterprise Architecta. Jestem zadowolony z tego, że EA nie wygłupia się i nie sięga tam, gdzie nie trzeba. Sprawę z otwieraniem socketów oraz SCSI zgłoszę w supporcie SparxSystems a odpowiedź opiszę tutaj. Widać wyraźnie, że profil w większości składa się z reguł dla Wine, nie dla EA – gdybym używał więcej aplikacji pod Wine to mógłbym część commonową dla Wine umieścić w osobnym profilu, który includowałbym w profilu dla EA.

Nie kończy się jednak na tym AppArmor, to dopiero czubek góry lodowej – zachęcam do zapoznania się z dokumentacją AppArmor i rozpoznania bardziej zaawansowanych możliwości.

Support społeczności Ubuntu dla AppArmor znajduje się na Launchpadzie, support komercyjny dla Ubuntu i AppArmor świadczy Canonical, a w Polsce support komercyjny dla Ubuntu oraz AppArmor oferuje gefira / the knowledge company.

Share
Categories: Software Tags: , , ,