Fxruby - zabezpieczenie

Witam i o radę pytam.
Powoli kończę aplikację opartą o FXRuby. Klient ma odpalić ikonkę z pulpitu na linuksie i graficzna aplikacja ma zacząć działać.

Chodzi o to, żeby klient nie miał możiwości podglądnięcia skryptu, w którym jest hasło do bazy danych. Wiadomo, w skypcie jest podana nazwa bazy danych i użytkownik z prawami DELETE, UPDATE etc.

Skypt ruby nie jest binarką a jest interpretowany więc na dobrą sprawę musi mieć atrybut odczytu. A jak tak to ciężko z zabezpieczeniem. Ma ktoś jakieś pomysły?

Zawsze użytkownik może “podsłuchać” takie hasło. Najlepiej to zrealizować projektując aplikację na trzech warstwach - Baza danych / Serwer aplikacji / Klient.
Mógłbyś wtedy np. jako serwer aplikacji postawić Railsy udostępniający mechanizm REST po XML (niekoniecznie RAILS - Sinatra też nie byłaby chyba zła do tego celu.

Miałbyś załatwiony problem uprawnień - klient autoryzowałby się na serwerze aplikacji, utrzymywał sesję, a serwer aplikacyjny nie pozwolilby userowi na robienie brzydkich rzeczy. Baza byłaby względnie bezpieczna

A jak można podsłuchać hasło ze skryptu w linuksie jak się jest zwykłym użytkownikiem?
Aplikacja jest już na ukończeniu jako zwykły skypt .rb działający bez żadnych railsów tylko z biblioteką Fox.

$ cat skrypt.rb
i widzisz hasło…

Ja bym to zrobił na kilka sposobów.

  1. Jakis Hash czy cos, w Fx masz na pewno mozliwosc przy starcie wczytac plik ze skryptem i go jakos odhashowac, np poprzesuwac kazdy znak o 1, czy cokolwiek takiego. Powinno dac rade
  2. trzymac plik z danymi na zewnatrz i go includowac
  3. Może zapisać te hasło jako stala w Fx, i wywoływać skrypt z parametrem, pobierajac go np z ARGV[0]
  4. … kilka innych mozliwości, trzeba by pomyśleć.

Nawet jakiś hash na haśle to już coś. Większość ludzi nie przetrzepie kodu by znależć sposób na odhashowanie tego

[quote=hubertlepicki]$ cat skrypt.rb
i widzisz hasło…[/quote]
No nie do końca. Ty piszesz o sytuacji jak użytkownik ma dojście do skrytpu - wtedy masz rację.

Zadałem to pytane w kontekście, czy da się podglądnąć dane z procesu linuksowego? To tak na marginesie bo aż takie duże zabezpieczenia mi w tym przypadku nie są potrzbne.
Przykłąd tego co miałem na myśli:

ps aux | grep "ruby" user1 7043 8.9 2.9 46564 30032 pts/0 S+ 19:32 0:04 ruby ./app.rb <-----------!!!!!!!! user1 7074 0.0 0.0 3004 764 pts/1 R+ 19:32 0:00 grep ruby
Szkoda, że linuks pokazuje przy rubym nazwę skryptu. Wie ktoś jak w linuksie tego się pozbyć, by zamaskować nazwę skryptu? Na dobrą sprawę mogę skasować z systemu polecenie ps i użytkownik chyba wtedy już nie podglądnie.

A swoją drogą chyba wpadł mi do głowy bardzo prosty sposób, a wydaje mi się że zawsze najprostsze rozwiązania są najlepsze. Co sądzicie na temat takiego zabezpieczenia?

  • napisać w języku C/C++ programik i skompilować pod konkretnym linuxem, przy użyciu G++
  • programowi dać uprawnienia tylko do wykonywania dla użytkownika - użytkownik nie może ani czytać ani zapisywać tego pliku
  • program ten wykonywałby sie z prawami roota’ i miałby dostęp do skryptu który też miałby prawa roota.
  • program ten wywołałby komendę ruby nazwa programu i chyba user nic już nie podglądnie - chyba, że istnieje w linuksie wyciągniecie danych z procesu.

Jak to widzicie? Mógłby ktoś napisać tych parę linijek w C/C++, które by wywołały: ruby moj_program.rb?

#include <stdlib.h> int main() { system("./skrypt.rb"); }
masz w linux top jeszcze by pokazac liste procesow

ale źle kombinujesz Linux to nie windows, dajesz prawa userowi tylko takie jakie potrzebuje. Możesz mu nawet shell zabrać. A tym bardziej dostep do wszytskich niepotrzebnych mu komend. Tak by tylko mógł ten programik odpalić i tyle.

A tak na marginesie

mozesz odpalic skrypt potokiem, kolejna fajna rzecz w linuxie

cat a.rb | ruby

wtedy
ps aux | grep ruby

pokaze tylko
ruby

bez nazwy skryptu

a informacji o nazwie skryptu nigdzie nie bedzie.

ps aux | grep nazwa.rb

nic nie zwroci

Dzięki gotar - przydadzą się twoje wskazówki.

Dobrze kombinujesz, żeby użyć binarki do odpalenia skryptu rubiowego. Jak dorzucisz do tego suid to powinno być względnie bezpiecznie.

Masz 2 pliki:

  • app.rb - aplikacja ruby, tu masz zaszyte hasło. Prawa tylko dla właściciela
  • start_app - binarka, zmienia uid i uruchamia app.rb. Prawa dla wszystkich do odczytu/uruchomienia

$ ls -l -rwx------ 1 rubyfx rubyfx 75 2009-11-26 21:39 app.rb -rwsr-sr-x 1 foo foo 9257 2009-11-26 21:38 start_app
Teraz każdy user inny niż rubyfx i root mogą uruchomić ./start_app, ale nie mogą odczytać app.rb

//app_start.c
//gcc -o app_start app_start.c
//chmod +s ./app_start

//uid usera rubyfx = 1000

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

const char* APP_PATH = "app.rb";

int main()
{

    int pid = fork();
    if(pid == 0)
    {   
        char *argv[] = { NULL };
        setuid(1000); //uid usera rubyfx
        execv(APP_PATH, argv);
    }   
}
#!/usr/bin/env ruby
#app.rb

PASSWORD = "rails scale"

puts "I know password but you cant see it"
$stdout.flush

user@localhost$ cat app.rb cat: app.rb: Permission denied user@localhost$ ./start_app I know password, but you cant see it
Ogólnie to proof of concept i nie jestem pewien czy w 100% to jest bezpieczne, ale na pewno lepsze niż security through obscurity :slight_smile:

Ps zamiast Fx który chyba jest płatny jest ciekawy sposób czysto railsowy by go zastąpić w Ruby i Gtk2 można napisać (jets nawet gotowa), prostą przeglądarkę www, i przepuścić ją przez rubyexec czy jak to się nazywa. I masz w sumie to samo. Ale to tez proof of concept, ale myśle nad takim projektem jakiś czas już. Na razie pisze w Gtk2 i rubym odtwarzacz muzyczny.

michmin - dzięki bardzo za gotowy sposób. Jak ukończę skrypt zastosuję to co podałeś.
gotar:

[quote]foxGUIb is open source and redestributable under the terms of the Artistic License.
libGUIb is redistributable for commercial and non-commercial use under the terms of the LGPL.
Source files generated by foxGUIb are free for commercial and non-commercial use.[/quote]
A railsów nie umiem :wink: A te kombinacje o których piszesz to dla mnie kosmos.
Staram się używać zawsze rozwiązań najprostszych. Np. jade z czystym w SQL’em w rubym bo na activerecord i poznawanie wszystkiego od początku szkoda mi czasu. Co więcej - eksperymentowanie z zapytaniami do bazy w oparciu o jakieś activerecordy itp. jak dla mnie to porażka - w jednym miejscu się walniesz i skutek może być tragiczny.

Zwłaszcza jeśli chodzi tam o te zależności belongs_to. To trzeba bardzo dobrze zrozumieć żeby stosować. A materiałów niezbyt dużo. Dla przykładu szukałem w sieci jak korzystać z activerecord bez railsów - porażka. Więc odpuściłem.

Co do Foxa - bardzo dobry interfejs właśnie ze względu na darmowość. Jak dla mnie rewelacja.
I do tego stabilny - dużo aplikacji naukowych, na uniwerkach, za granicą powstaje w oparciu o FXRuby.