Strony

piątek, 9 listopada 2012

VMWare Workstation - base and differential disk vmdk

Sposób tworzenia (klonowania) wirtualnych maszyn korzystających z jednego dysku bazowego oraz dysków różnicowych dla każdej z maszyn.

Przykład dla Windows XP, lecz można tą technikę zastosować do każdego systemu operacyjnego uwzględniając procedury po klonowaniu OS (np.: NewSID dla Windows: http://technet.microsoft.com/en-us/sysinternals/bb897418.aspx)

Tworzymy maszynę bazową "WindowsXPbase" o ustalonej konfiguracji. Dysk VMDK może być w jednym pliku (Store virtual disk as a single file).







Na "WindowsXPbase" instalujemy system (dobra praktyka mówi, aby jeden dysk VMDK był przeznaczony pod jedną partycję) i wstępnie konfigurujemy nasz bazowy system.

Po instalacji i konfiguracji wyłączamy maszynę "WindowsXPbase" a plik dysku WindowsXPbase.vmdk kopiujemy do katalogu wyżej. Resztę usuwamy.

Odczytujemy nr CID dysku "WindowsXPbase", można to zrobić przy pomocy Total Commandera (F3) - Ta funkcja podglądu nie wczytuje całego pliku, co w przypadku np 6GB plików dysku nie spowoduje wczytania całego pliku do ramu :)

Możemy też użyć narzędzi dsfok-tools ze strony
http://members.ozemail.com.au/%7Enulifetv/freezip/freeware/.

W celu odczytania CID wykonujemy eksport ustawień dysku za pomocą dsfo.exe do pliku WindowsXPbase_config.exe
dsfo.exe WindowsXPbase.vmdk 512 1024 WindowsXPbase_config.txt
Numer dysku WindowsXPbase.vmdk
CID=ef33191c
Tworzymy kolejną maszynę "WindowsXPdifferential" o takich samych parametrach jak poprzednia.


Eksportujemy konfigurację:
dsfo.exe WindowsXPdifferential.vmdk 512 1024 WindowsXPdifferential_config.txt
OK, 1024 bytes, 0.000s, MD5 = 4515b65e9d48cb2a1ba452b183528eb7
Wprowadzamy zmiany w konfiguracji (CID, createType, parentFileNameHint):

Przed
#Disk DescriptorFile
version=1
encoding="windows-1250"
CID=fffffffe
parentCID=ffffffff
isNativeSnapshot="no"
createType="monolithicSparse"
Po
# Disk DescriptorFile
version=1
encoding="windows-1250"
CID=fffffffe
parentCID=ef33191c
isNativeSnapshot="no"
createType="twoGbMaxExtentSparse"
parentFileNameHint="..\WindowsXPbase.vmdk" 
Importujemy konfigurację:
dsfi.exe WindowsXPdifferential.vmdk 512 1024 WindowsXPdifferential_config.txt
OK, written 1024 bytes at offset 512

Gotowe.

Jak odpalimy maszynę, system zostanie załadowany z dysku znajdującego się piętro wyżej "..\WindowsXPbase.vmdk", a wszelkie zmiany będą zapisywane w pliku maszyny wirtualnej "WindowsXPdifferential.vmdk"

wtorek, 6 listopada 2012

fix rrd data


Naprawa błędnych dane w bazie rrd spowodowanych nieprawidłowym odczytem wartości przez skrypt.

1. wykonać eksport danych do xml'a (rrdtool dump)
2. podmienić nieprawidłowe wartości (sed)
3. wykonać import danych (rrdtool restore)

Wykres wygenerowany z pikami - przed naprawą:


Wykres wygenerowany po naprawie pliku rrd


Skrypt automatyzujący pracę:
fix_script_rrd.sh
#!/bin/sh

cp /usr/local/pnp4nagios/var/perfdata/server/SPEED_NET.rrd /root/scripts/rrd_export_testy/SPEED_NET_server.rrd-$(date +%Y-%m-%d-%s)
mv /usr/local/pnp4nagios/var/perfdata/server/SPEED_NET.rrd /root/scripts/rrd_export_testy/SPEED_NET_server.rrd
cp /usr/local/pnp4nagios/var/perfdata/server/SPEED_NET.rrd /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.rrd
rrdtool dump /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.rrd > /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml

sed -i 's/-6.4146433246e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-2.2227638513e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-1.2606894794e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-6.3459103635e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-5.5899984061e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-5.0475658794e+08/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-2.5594901404e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-4.7378915353e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-1.2606858468e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-1.0086951488e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-4.1772191908e+08/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-1.8516738435e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-1.8025172614e+08/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-1.8024471851e+08/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml
sed -i 's/-2.5663505765e+09/0/g' /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml

rrdtool restore /root/scripts/rrd_export_testy/SPEED_NET_server_BEFORE.xml /root/scripts/rrd_export_testy/SPEED_NET_server_AFTER.rrd
rrdtool dump /root/scripts/rrd_export_testy/SPEED_NET_server_AFTER.rrd > /root/scripts/rrd_export_testy/SPEED_NET_server_AFTER.xml

cp -f /root/scripts/rrd_export_testy/SPEED_NET_server_AFTER.rrd /usr/local/pnp4nagios/var/perfdata/server/SPEED_NET.rrd

wtorek, 16 października 2012

SSH Keys - ssh: Exited: String too long


W celu wygenerowania pary kluczy do autoryzacji w usłudze ssh zainstalowałem OpenSSH keygen:
openssh-keygen - 5.8p2-2 - OpenSSH keygen.

Po wygenerowaniu pary kluczy przekopiowałem klucz publiczny na zdalny serwer
Niestety próba połączenia zwróciła błąd:
ssh -i /root/.ssh/id_rsa  root@remotehost
ssh: Exited: String too long

Rozwiązanie:
Klucze trzeba wygenerowac za pomocą dostępnego w OpenWRT dropbearkey

localhost
dropbearkey -t rsa -f /root/.ssh/id_rsa
dropbearkey -y -f /root/.ssh/id_rsa | grep ssh-rsa > /root/.ssh/id_rsa.pub
scp /root/.ssh/id_rsa.pub root@remotehost:/root

Remotehost
cat /root/id_rsa.pub >> /etc/dropbear/authorized_keys
chmod 600 /etc/dropbear/authorized_keys

localhost
ssh -i /root/.ssh/id_rsa root@remotehost

BusyBox v1.15.3 (2011-11-11 18:03:51 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

2011-11-12 - r28934
  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03.x, latest version. Always.) -------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua
  * 1/3 shot Bailey's  on the bottom, then Bailey's,
  * 1/3 shot Vodka     then Vodka.
 ----------( by obsy, http://eko.one.pl/ )----------
Booted from internal flash
root@remotehost:~$


Do czego można to wykorzystać?
Np. Backup
tar czf - /overlay | ssh -i /root/.ssh/id_rsa root@backupserver "cat > /mnt/backupdir/backup-host1-$(date +%Y-%m-%d-%s).tgz"

wtorek, 15 maja 2012

Backup and Restore ACL NTFS with SetACL

Przeniesienie uprawnień NTFS (DACL) pomiędzy zasobami:


Backup uprawnień NTFS z server1
SetACL.exe -on "\\server1\c$\test" -ot file -actn list -lst "f:sddl;w:d,o,g" -rec cont -bckp "d:\tmp\acl-ntfs.txt"

Edytuj plik "acl-ntfs.txt"
Zmień ścieżki UNC z "\\?\UNC\server1\c$\test" na "\\?\UNC\server2\c$\test"


Restore uprawnień NTFS na server2
SetACL.exe -on "\\server2\c$\test" -ot file -actn restore -bckp "d:\tmp\acl-ntfs.txt" -log "log.txt"

Jeśli chcesz wykonać backup i restore uprawnień na zasobie sieciowym (SACL) to w sekcji -lst trzeba dodać "s", czyli:
-lst "f:sddl;w:d,s,o,g"
 
Strona projektu:
http://sourceforge.net/projects/setacl/
http://helgeklein.com/

Źródła:
http://bog.no/index.php/artikler/2-how-to-backup-ntfs-acl

sobota, 19 listopada 2011

OpenWRT (Backfire) + lighttpd + PHP5 + AUTH + SSL

Instalacja i konfiguracja lighttpd i php z autoryzacją typu digest (htdigest)

UPDATE: 2013-01-15

W skrócie:
Konfiguracja lighttpd wraz z php5, autoryzacją na poziomie serwera www oraz przekierowaniem wybranych katalogów z http na https, a po co ? A po to, żeby bezpiecznie się autoryzować.
Sprzęt:
TP-LINK TL-WR1043ND, alternatywny firmware ze strony http://eko.one.pl, OpenWrt Backfire 10.03.1-RC6 r28934 2011-11-12, skonfigurowany extroot 2GB

1. Instalacja i konfiguracja lighthttp
2. Instalacja i konfiguracja php
3. Włączenie https w lighttpd
4. Autoryzacja w lighttpd
5. Redirect z http na https
6. Firewall
7. Literatura



1. Instalacja i konfiguracja lighthttp
Instalujemy serwer
opkg update
opkg install lighttpd
Modyfikujemy plik konfiguracyjny
#/etc/lighttpd/lighttpd.conf
server.document-root = "/www"
Startujemy serwer i sprawdzamy czy działa
/etc/init.d/lighttpd start
Następnie stopujemy serwer WWW
/etc/init.d/lighttpd stop

2. Instalacja i konfiguracja php
Instalujemy php i moduł do lighttpd
opkg update
opkg install lighttpd-mod-cgi
opkg install php5-cgi
Aby interpreter php pracował poprawnie w pliku konfiguracyjnym /etc/php.ini zmienna doc_root powinna być skonfigurowana identycznie jak zmienna server.document-root w konfiguracji lighttpd
#/etc/php.ini
doc_root = "/www"
Konfiguracja lighttpd
#/etc/lighttpd/lighttpd.conf
server.modules = (
...
        "mod_cgi",
...
)
cgi.assign = ( ".php"  => "/usr/bin/php-cgi" )
index-file.names = ( "index.html", "default.html", "index.htm", "default.htm", "index.php")
Tworzymy plik php i sprawdzamy czy działa
echo "<#? PHP phpinfo(); ?#>" >> /www/index.php
# - usuń to - blogger parsuje kod

Aby interpretować skrypty sh dodajemy:
cgi.assign = ( ".sh"  => "/bin/sh" )

3. Włączenie https w lighttpd
Instalujemy openssl i generujemy certyfikat typu self-sign
opkg update
opkg install openssl-util
cd /etc/lighttpd/
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
chown root:root server.pem
chmod 400 server.pem

Włączenie SSL można wykonać ją na 2 sposoby:

a. Za pomocą poniższej konfiguracji lighthttp przełączy się w tryb SSL-only, oznacza to, że będzie nasłuchiwał tylko i wyłącznie na porcie 443.
#/etc/lighttpd/lighttpd.conf
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/server.pem"

W dokumentacji jest napisane, ze prawdopodobnie trzeba będzie również zmienić server.port na 443, nic podobnego, w OpenWRT (lighttpd/1.4.28 (ssl)) serwer automatycznie zabindował się do portu 443

b. Aby włączyć SSL obok normalnego HTTP czyli równolegle serwować tą samą stronę po http i https,  należy dodać socket do konfiga.
$SERVER["socket"] == ":443" {
     ssl.engine                  = "enable"
     ssl.pemfile                 = "/etc/lighttpd/server.pem"
 }
4. Autoryzacja w lighttpd
Instalacja modułu AUTH
opkg update
opkg install lighttpd-mod-auth

Włączamy moduł auth
#/etc/lighttpd/lighttpd.conf
server.modules = (
...
        "mod_auth",
...
)

## debugging
# 0 for off, 1 for 'auth-ok' messages, 2 for verbose debugging
auth.debug = 2

# definiujemy metodę autoryzacji

auth.backend = "htdigest"

# wskazujemy plik z loginami i haslami
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd-htdigest.user"

#definiujemy gdzie obowiązuje autoryzacja: czyli katalog download, użytkownicy muszą zostać autoryzowani metodą digest, lecz zostaną wpuszczeni tylko ci, którzy należą do strefy "download area"
auth.require = ("/download/" =>
  (
     "method"  => "digest",
     "realm"   => "download area",
     "require" => "valid-user"
  )
)

Tworzymy prosty skrypt dodający użytkowników do pliku o nazwie htdigest.sh
#!/bin/sh
user=$1
realm=$2
pass=$3
hash=`echo -n "$user:$realm:$pass" | md5sum | cut -b -32`
echo "$user:$realm:$hash"

#nadajemy prawa do wykonywania
chmod 755 htdigest.sh

#przykład użycia:
#./htdigest.sh[space]'login'[space]'realm'[space]'password'
./htdigest.sh 'piotr' 'download area' 'password' >>/etc/lighttpd/lighttpd-htdigest.user
5. Redirect z http na https
Instalacja modu REDIRECT
opkg update
opkg install lighttpd-mod-redirect
Włączamy moduł redirect i ustawiamy, aby podczas próby wejścia do katalogu download nastąpiło przekierowanie na ten sam adres lecz po protokole https
#/etc/lighttpd/lighttpd.conf
server.modules = (
...
       "mod_redirect",
...
)

#poniższy kod sprawi, że zostaniemy przekierowani z  adresu http://serwerip/download/ na https://serwerip/download/

$SERVER["socket"] == ":80" {
        $HTTP["url"] =~ "^/download/*" {
                $HTTP["host"] =~ "(.*)" {
                        url.redirect = ( "^/(.*)" => "https://%1/$1" )
                }
        }
}

Jeśli chcemy przekierować wszystko z portu 80 na 443
$SERVER["socket"] == ":80" {
    $HTTP["host"] =~ "(.*)" {
        url.redirect = ( "^/(.*)" => "https://%1/$1" )
    }
}

6. Firewall
Na koniec wypuszczenie serwera w eter, odblokowanie portu 443 lub/i 80 na firewallu na interfejsie WAN
#/etc/config/firewall

config rule
        option src              wan
        option proto            tcp
        option dest_port        443
        option target           ACCEPT

config rule
        option src              wan
        option proto            tcp
        option dest_port        80
        option target           ACCEPT


/etc/init.d/firewall restart

7. Literatura
http://eko.one.pl/?p=openwrt-php
http://eko.one.pl/?p=openwrt-http
http://redmine.lighttpd.net/wiki/lighttpd/Docs:SSL
http://redmine.lighttpd.net/wiki/lighttpd/HowToSimpleSSL
http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModAuth
http://redmine.lighttpd.net/wiki/lighttpd/HowToAuthenticationFromMultipleFiles
https://wiki.archlinux.org/index.php/Lighttpd_for_SSL_and_non-SSL
http://redmine.lighttpd.net/wiki/lighttpd/TutorialLighttpdAndPHP
http://redmine.lighttpd.net/wiki/lighttpd/HowToRedirectHttpToHttps
http://redmine.lighttpd.net/wiki/lighttpd/HowToRedirectWww

czwartek, 17 listopada 2011

OpenWRT (Backfire) + lighttpd + php5 + DokuWiki

Po podstawowej konfiguracji lighttpd + php5 pobrałem stabilną wersję DokuWiki (www.dokuwiki.org)
cd /tmp
wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2011-05-25a.tgz
gzip -d dokuwiki-2011-05-25a.tgz
tar -xvf dokuwiki-2011-05-25a.tar
mv dokuwiki-2011-05-25a /home/lighttpd/ssl/html/
Przy próbie instalacji aplikacji
http://server/dokuwiki/install.php
otrzymałem błąd:
The installer found some problems, indicated below. You can not continue until you have fixed them.

    * PHP function session_start is not available. Maybe your hosting provider disabled it for some reason?
    * PHP function utf8_encode is not available. Maybe your hosting provider disabled it for some reason?
    * PHP function utf8_decode is not available. Maybe your hosting provider disabled it for some reason?

Rozwiązaniem było doinstalowanie modułów php:
opkg update
opkg install php5-mod-session
opkg install php5-mod-xml

Nie ma potrzeby ingerencji w plik konfiguracyjny /etc/php.ini
ponieważ po instalacji w lokalizacji /etc/php5/ tworzą się odpowiednie pliki konfiguracyjne .ini
root@server:~$ cat /etc/php5/session.ini
extension=session.so

wtorek, 11 października 2011

VBScript - skrypty AD

1. Wyszukiwanie użytkownika w AD i listowanie jego atrybutów.

'SearchforaUserAccountinActiveDirectory

FilePath=".\samAccountName.txt"'Sciezkadoplikuzdanymiwejściowymi (np. JanKowalski)
SetobjFSO=CreateObject("Scripting.FileSystemObject")
SetobjFile=objFSO.OpenTextFile(FilePath,1)

DoUntilobjFile.AtEndOfStream
    strsamAccountName=objFile.ReadLine()

SetobjConnection=CreateObject("ADODB.Connection")
objConnection.Open"Provider=ADsDSOObject;"

SetobjCommand=CreateObject("ADODB.Command")
objCommand.ActiveConnection=objConnection

objCommand.CommandText=_
"<[*]LDAP://dc=domain,dc=com,dc=pl>;(&(objectCategory=User)"&_
"(samAccountName="&strsamAccountName&"));adspath;subtree"


SetobjRecordSet=objCommand.Execute

IfobjRecordset.RecordCount=0Then
    'WScript.Echo"sAMAccountName:" & strsamAccountName & "doesnotexist."
Else  
    WhileNotobjRecordset.EOF
        SetobjUser=GetObject(objRecordset.Fields(0).Value)
        WScript.EchoobjRecordset.RecordCount & "|" & objUser.samAccountName & "|" & objUser.mail
        objRecordSet.MoveNext
    Wend
EndIf
objConnection.Close
Loop
[*] - usuń te znaki (Blogger filtruje publikowane treści)