Etikettarkiv: ubuntu

DevOps Säkerhet

Att jobba med DevOps samt IT-säkerhet är några av de områden som jag gillar mest. Därför är det intressant att ibland stanna upp och reflektera. För inom DevOps handlar det oftast om att skeppa kod så snabbt som möjligt och bygga skalbara och snabba mikroinfrastrukturer med continuous integration. Säkerhet däremot ses ofta som en bromskloss i utvecklingsarbetet.

Det går att fuska med säkerhet: Genomföra saker snabbt men se säkerheten som ett lån med ränta. Att betala tillbaka på lånet snabbare gör att säkerheten blir bättre och det blir inte lika dyrt längre fram (technical debt).

Att ta med säkerheten tidigt i sin planering är viktigt, för använder ni Docker så se till att använda SELinux eller AppArmor (vilket bl.a. Ubuntu Snappy gör som standard).

Exponera ej Elasticsearch, Redis, MongoDB eller andra databaser direkt mot Internet, vilket tyvärr förekommer och nyttjas av elakingar.

Se även till att inte lagra lösenord i klartext och genomför säker radering av information. Visste du exempelvis att Mac OS X har kommandot srm?

srm – securely remove files or directories

Nu är det nog med rant för det blir faktiskt bättre. Och för att ge lite matnyttiga tips tänk på följande:

10 tips till säkrare DevOps

  1. Genomför inte bara backup. Kontrollera även löpande att den verkligen innehåller allt och fungerar. Backup för prod ska ej vara tillgänglig från stage och vice versa.
  2. Prod-, stage- och utvecklingsmiljöer ska ej dela nycklar, lösenord etc.
  3. Tänk på att ej lägga alla ägg i samma korg. Nyttja exempelvis Amazons availability zones.
  4. Kryptera så mycket som möjligt. Inte bara in-transit utan även lokalt, undvik helt klartextprotokoll samt införskaffa SSL-Certifikat.
  5. ossecLogga mycket och filtrera samt arkivera med hjälpmedel såsom OSSEC. Som förresten även kan hålla koll på filintegritet.
  6. Bevaka med verktyg såsom Nagios, Pingdom och New Relic. Glöm inte ändpunkter för API (10 saker som Bit.ly glömde att bevaka).
  7. Genomför löpande säkerhetskontroller med verktyg såsom QualysNessus och Detectity. Även manuella återkommande granskningar är att rekommendera av företag som utför penetrationstester.
  8. Omvärldsbevaka och håll Er uppdaterad när det kommer nya sårbarheter i de mjukvaror som Er infrastruktur använder. Vad är best practices just nu för att lagra lösenord, är det bcrypt, scrypt eller pbkdf2?
  9. Segmentera och filtrera så mycket som möjligt. Ingen enskild server eller konto ska ha tillgång till allt.
  10. Checka aldrig in lösenord, nycklar eller annat känsligt till ett repo.

Tänk inte bara DevOps, tänk även SecOps.

Lös inte nästa problem som du stöter på, på följande sätt (saxat från Stackoverflow)

https stackoverflow

Tarsnap – Backup för den paranoide

Tarsnap är en backuptjänst i molnet för den som är paranoid. Kryptering genomförs på klientsidan innan datan skickas upp till Amazon S3-tjänst. Tarsnap är utvecklat av Colin Percival som är övermänsklig, han har bl.a. utvecklat scrypt och är säkerhetschef för FreeBSD.

Tarsnap har inget GUI och stödjer operativsystem såsom Mac OS X, Ubuntu, FreeBSD osv. Stöd till Windows finnes via Cygwin.

Så kommer du igång med Tarsnap

Först och främst laddar du hem tarsnap till din server eller klient:

$ wget https://www.tarsnap.com/download/tarsnap-autoconf-1.0.35.tgz

Och verifierar sedan nedladdningen:

$ sha256 tarsnap-autoconf-1.0.35.tgz
SHA256 (tarsnap-autoconf-1.0.35.tgz) = 6c9f6756bc43bc225b842f7e3a0ec7204e0cf606e10559d27704e1cc33098c9a

Sedan installerar du eventuella beroenden som kan behövas. Detta är för Ubuntu:

$ sudo apt-get install libssl-dev zlib1g-dev e2fslibs-dev make

Vi extraherar tarsnap och bygger koden:

$ tar xvfz tarsnap-autoconf-1.0.35.tgz
$ cd tarsnap-autoconf-1.0.35/
$ ./configure && make
$ sudo make install

Och förhoppningsvis gick allt bra och tarsnap är installerat. Om du inte har något konto på tarsnap.com så är det läge att skapa det nu.

Nu skapar vi en nyckel för denna server och anger våra uppgifter som vi använde när vi skapade kontot på tarsnap.com:

$ tarsnap-keygen --keyfile /root/https-tarsnap.key --machine https.se --user [email protected]

Viktigt här är att du sparar undan nyckelfilen https-tarsnap.key på ett annat system än det du gör backup på. För förlorar du denna fil så kan du ej återskapa data från servern samt ser till att enbart användaren som gör backup får läsa denna nyckelfil.

Så gör du backup med Tarsnap

Finurligt så fungerar tarsnap precis som tar men med lite extra argument. Jag brukar skapa en fil vid namn backup.sh som även dumpar ut MySQL-databas så den följer med i backupen.

Så här ser min backup.sh ut som körs via cronjobb varje natt av root. Se även till att enbart root kan läsa filen backup.sh då den innehåller lösenord.

mysqldump -u root -plösenord https > /var/www/https.se/backup/`date +"%Y%m%d"`.sql
tarsnap --keyfile /root/https-tarsnap.key --cachedir /usr/local/tarsnap-cache -c -f https.se-`date +%F` /var/www/https.se/docs/ /var/www/https.se/backup/ /etc/nginx/sites-enabled/default-ssl /etc/nginx/sites-enabled/default 
tarsnap --cachedir /usr/local/tarsnap-cache --keyfile /root/https-tarsnap.key -d -f https.se-`date -d "2 days ago" +%F`

Den sista raden med tarsnap -d ser till att ta bort lagrade backuper som är äldre än två dagar. Du kan även behöva skapa katalogen /usr/local/tarsnap-cache/

Uppdatering: Kolla in denna gist som underlättar installationen.

Så testar du nya CoreOS

Psst! Du vet väl att du kan hyra mig för att göra underverk när det gäller DevOps, IT-säkerhet eller högprestandasystem. Kontakt hittar du här >

CoreOS är ett nytt spännande lättviktigt operativsystem som är byggt för att användas i klusterinfrastrukturer.

Opertivsystemet (OS) är även byggt för att användas till att köra flertalet Docker containers samt så har CoreOS automatiska säkerhetsuppdateringar med två root-filsystem som växlas mellan beroende om det enda uppdateras eller ej. Filsystemen är read-only samt os:et startas om automatiskt vid uppdateringar (eller kexec). Detta innebär så klart att du ej bör lagra något på lokala filsystemet permanent.

Fler fräsiga finneser är en key-value-storage motor inbyggt vid namn etcd (skriven i Go) som även kan användas för service discovery. Etcd synkroniseras automatiskt i hela ditt kluster vilket gör det ypperligt bra för att exempelvis peka ut var dina tjänster håller hus.

CoreOS kluster

CoreOS har tre utvecklare på heltid som jobbar med projektet samt är baserat på Chromium OS som Goolge står bakom. Har även fått in kapital från Andreessen Horowitz samt  Sequoia Capital.

För att testa CoreOS på Mac OS X med Vagrant gör du bara enligt följande:

$ git clone https://github.com/coreos/coreos-vagrant/
$ cd coreos-vagrant
$ vagrant up
$ vagrant ssh

Här är en skärmdump när jag ansluter via vagrant ssh:

CoreOS VagrantOch sedan är det bara att dra igång vår en container i Docker. I detta fall kör jag Ubuntu 13.10:

Docker Ubuntu 13 10

Och här skapade jag en screencast som visar hela förfarandet:

Har du testat CoreOS? Lämna gärna en kommentar om dina erfarenheter.

DevOps med Python Fabric

DevOpsOm du har precis som mig många servrar som är utspridda på flertalet leverantörer så finns det några smarta hjälpmedel för att underlätta administration och deployment av ny kod. Ett av dessa hjälpmedel heter Fabric och är snarlikt med Capistrano för Ruby.

På en Ubuntu-kärra så är det lättast att bara köra apt-get install fabric så får du prylarna du behöver på ett nafs (alternativt pip install fabric).

Testa sedan med:


$ fab

Fatal error: Couldn't find any fabfiles!

Remember that -f can be used to specify fabfile path, and use -h for help.

Aborting.

Det finns olika sätt att sedan använda fabric för att exekvera kommandon på flertalet servrar. De vanliga är att man skapar fabfiles eller bakar in det man vill göra direkt i sin Python-kod efter en import fabric.

Fabric i Python via import fabric

Rätt enkelt och behövs inte så många rader kod. Vår kod ser ut enligt nedan och startas med python kodnamn.py:

#!env python
from fabric.api import run,env,hosts,execute

env.key_filename = "/home/jonasl/jonasl.pem"
env.user = "ubuntu"

@hosts(['79.125.115.128'])
def uname():
  return run("uname -a")

execute(uname)

Ovan kod beskriver först vilken nyckelfil (pem) vi använder. Precis samma sak som att köra ssh -i jonasl.pem. Och env.user berättar vilken användare vi loggar in med.

Sen använder vi en rolig sak i Python som kallas för dekorator (decorator) och den sätter vilken IP-adress vi ska ansluta mot. Denna dekorator behövs inte i nästa exempel som skiljer sig lite.

Fabric direkt via kommandoskal och fabfile

När man använder kommandot fab så läser Fabric direkt en fil som heter fabfile.py i samma katalog som man står i och där kan man placera kommandon såsom ovan uname som ska köras mot olika servrar. Först skapar vi fabfile.py som ser ut så här:

#!env python
from fabric.api import run,env,hosts,execute

env.key_filename = "/home/jonasl/jonasl.pem"
env.user = "ubuntu"

def uname():
  return run("uname -a")

Sen kör vi bara fab -H ip-nummer uname på följande sätt:

$ fab -H 79.125.115.128 uname
[79.125.115.128] Executing task 'uname'
[79.125.115.128] run: uname -a
[79.125.115.128] out: Linux syslog 3.2.0-53-virtual #81-Ubuntu SMP Thu Aug 22 21:21:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Done.
Disconnecting from 79.125.115.128... done.
$

I nästa avsnitt ska jag gå igenom lite mer hur man kan använda olika server-roller för att skjuta utkod via git.

Så tolkar du MySQL:s felkoder

Rätt ofta så stöter jag problem med MySQL som då spottar ur sig någon typ av felkod. Dessa felkoder och hur de uppkommer brukar jag tyvärr hinna glömma bort mellan varven så därför skriver jag ner dem här för att underlätta för mig och dig:

Följande felmeddelande:

  • ERROR 3 (HY000) at line 11619: Error writing file ’/tmp/STUkun6Z’ (Errcode: 28)

Avkodas lättast genom att man skriver perror 28 vid en kommandotolk i Linux så bör något liknande komma fram:

  • OS error code  28:  No space left on device
Vilket är tämligen självförklarande. Slut på hårddiskutrymme på den monteringspunkten.
Om du sedemera utför någon typ av import eller dylikt som kan ta sjukt lång tid så brukar jag använda två bra trick:
  • Visa hur lång tid som är kvar av importen med följande kommandorad: pv filnamn.sql | mysql -u root -p (pv är ett användbart litet program som kan installeras via apt-get install pv)
Output blir ungefär följande då:
  • 10,9GB 1:24:51 [ 1,1kB/s] [=====>             ] 19% ETA 5:59:32
Och det andra tricket är att undersöka vad som händer genom SHOW PROCESSLIST vilket med fördel kan köras på följande sätt:
  • echo ’show processlist’|mysql -u root -plösenord -B
Nu till nästa felmeddelande:
  • ERROR 1071 (42000) at line 11673: Specified key was too long; max key length is 1000 bytes
Det tog ett tag innan jag insåg hur detta felmeddelande uppstod och det var pga att InnoDB-motorn i min MySQL installation ej startades pga felaktiga konfigurationsvariabler i my.cnf och då gick MySQL automatiskt över till MyISAM. Denna ”bugg” har funnits i många år och upprört en hel del (se sista kommentaren här). Kan vara rätt jobbigt om man gör mysqldump på ett system för att sedan läsa in dumpen på ett annat system och det ej fungerar.
Nästa problematik är inte direkt ett felmeddelande utan någon jag stött på då en import tog sjuk lång tid. Vid undersökning så stod det ”repair by sorting” vilket är något som kan ta många timmar. Efter lite googlande så hittade jag att en snabbare repair finns och då skall följande meddelande visas vid SHOW PROCESSLIST: repair using keycache. Fixas genom att sätta myisam_max_sort_file_size=10G i my.cnf.
Om du använder dig av mysqlimport eller LOAD DATA INFILE och får något av följande felmeddelanden:
  • Error: 13, Can’t get stat of ’/var/lib/mysql/Desktop/abc123’ (Errcode: 2)
  • File ’/home/standage/Desktop/abc213’ not found (Errcode: 13)

Så beror det troligtvis på att du ej har behörighet eller att du ej angett hela sökvägen till filen. Brukar jag lösa genom att genomföra importen med ett mysql-root konto.

Uppdatering: Något annat som kan ställa till fel hos MySQL är nya AppArmor som standard används i senare versioner av Ubuntu. Om du ändrar exempelvis datadir så kommer det ej att fungera. Då måste du ändra i apparmor-profilen för MySQL.

Besök hos Microsoft i Redmond

Jag har blivit utvald som en av fem personer från Sverige åka till Microsofts huvudkontor i Redmond och lära mig lite om Microsoft och dess verksamhet och produkter. Jag har sedan tidigare ett relativt platoniskt förhållande till Microsoft, dock så använder jag dess operativsystem Windows dagligen i någon form. På serversidan så faller dock mitt val på Ubuntu/Linux eller Free/OpenBSD.

Det enda event jag medverkat tidigare på i Microsofts regi är ett trevligt rundabordssamtal som Stephanie Smitt Lindberg (numera på Scandic) bjöd in till 2009 (bloggytråd om inbjudan).

Vi fem som åker förutom mig själv är Walter Naeslund, Pingis Hadenius, Joakim Jardenberg och Tommy K Johansson.

Tidningen Resumé har har skrivit roligt om detta.

Ubuntu 10.10

För några dagar sedan så släpptes Ubuntu 10.10 eller ”The Maverick Meerkat” som releasen också kallas. Jag använder mestadels Ubuntu på serversidan och använder således server-versionen av Ubuntu utan grafiskt gränssnitt.

Uppgraderingen gick smärtfritt och tog cirka en timme med hjälp av följande kommandon:

  1. sudo apt-get install update-manager-core
  2. edit /etc/update-manager/release-upgrades och ändra Prompt=normal
  3. sudo do-release-upgrade

När uppgraderingen är färdig så är Nginx uppdaterad till version 0.7.67 som är den senaste stabila samt går det även att installera php5-fpm direkt via apt. Annat bra med maverick är att Redis paketet är version 2.0.0 istället för 1.2.0 som skeppas med lucid.

När uppgraderingen är klar så kan du köra kommandot lsb_release -a så bör det se ut enligt följande:

Distributor ID: Ubuntu
Description:    Ubuntu 10.10
Release:        10.10
Codename:       maverick
Ubuntu server 10.10 kan laddas hem här: ubuntu.com/server/get-ubuntu/download

Så kommer du igång med Nginx + PHP-FPM

Nginx är en supersnabb webbserver/proxy skriven av ryssen Igor Sysoev och används av exempelvis WordPress.com och Loopias höghastighetstjänst Autobahn. I dagsläget så använder ca 8% av världens webbservar just Nginx som webbserver eller front-end proxy.

Nginx är även mitt självklara val vid installation av nya servrar, men dock är installationen inte helt enkel eftersom det inte finns inbyggt PHP-stöd vilket är det primära programmeringsspråk jag använder vid webbutveckling. Nginx är således beroende av exempelvis PHP-FPM (FastCGI Process Manager for PHP).

Installation

Först och främst så ska vi lägga till dotdeb i vår sources.list genom följande kommando:

$ sudo sh -c ’echo ”deb http://php53.dotdeb.org stable all” >> /etc/apt/sources.list’

Lägg sedan till rätt nycklar:

$ gpg –keyserver keys.gnupg.net –recv-key 89DF5277

$ gpg -a –export 89DF5277 | sudo apt-key add –

Nu kan vi synkronisera paketlistorna:

$ sudo apt-get update

Sen måste vi lägga till några paketberoenden:

$ wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.4~beta1-5ubuntu2_i386.deb

$ wget http://us.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu38_3.8-6ubuntu0.2_i386.deb

$ sudo dpkg -i *.deb

Och sist men inte minst så installerar vi paketen via apt:

$ sudo apt-get install php5-fpm php5-cgi nginx

Sen måste nginx konfigureras och lättast är att utgå från den standard-konfiguration som medföljer och återfinns i filen /etc/nginx/sites-available/default. Om du vill se hur min konfigg-fil ser ut kan du utgå från denna.

Starta sedan om php-fpm samt nginx om de inte redan startas:

$ sudo sh /etc/init.d/nginx restart

$ sudo sh /etc/init.d/php5-fpm restart

Om php5-fpm klagar om pm.min_spare_servers eller liknande så måste du eventuellt ta bort en kommentering i filen /etc/php5/fpm/php5-fpm.conf

Thats’s it! Återkommer om jag hittar något lättare sätt att komma igång med nginx och php-fpm.

Redis är guds gåva till webbutvecklaren

Efter mitt blogginlägg om hur jag använder Memcache för att logga många klick så fick jag ett tips av Emil Stenström (som bl.a bloggar på FriendlyBit.com) om att ta en titt på Redis. Redis går lättast att beskriva som en storebror till Memcache som fungerar ungefär på samma sätt men har betydligt fler funktioner.

Redis stödjer exempelvis listor där du lätt kan skapa en FIFO-lista eller varför inte spara data under en längre tid eftersom Redis standardmässigt inte kastar bort något som Memcache gör.

Att installera och använda Redis under Ubuntu 9.10 så kan du göra enl. följande:

$ sudo apt-get install redis-server

$sudo apt-get install libphp-redis

Sedan är det bara att inkludera /usr/share/php/redis.php i din PHP-kod och testa Redis:

<?php

require_once "/usr/share/php/redis.php";
$redis = new Redis();
$redis->set("nyckel", "värde");
echo $redis->get("nyckel");

?>

Prestandan är imponerande:

110000 SETs/second, 81000 GETs/second

Observera även att paketet redis-server finns med i Ubuntu från och med version 9.10.

ffmpeg

Jag har hållt på att donat och strulat och försökt att få ffmpeg att lira med mer videoformat och codecs men det har inte varit en helt smärtfri väg att få till allt. Vet inte riktigt var jag ska börja men ffmpeg är ett verktyg för att hantera filmer på en massa sätt, exempelvis konvertering.

Genom att köra ffmpeg -v så konstaterade jag att varken libmp3lame eller libamr (3GPP/3GP) var inkompilerat i standardbinären på Ubuntu Edgy som jag kör:

FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: –enable-gpl –enable-pp –enable-swscaler –enable-pthreads –enable-libvorbis –enable-libtheora –enable-libogg –enable-libgsm –enable-dc1394 –disable-debug –enable-shared –prefix=/usr

Så klart så testar jag ju att använda apt-src install ffmpeg och sedan modifiera debian/rules filen för att tillfredställa mina behov, men icket! Otaliga kompileringsfel i amr vilket jag försöker fixa men ger upp efter ett tag.

Dags och byta taktik, checkar ut en fräsch ffmpeg version från svn:

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg-svn

Och efter att kliat huvet och kompilerat om ffmpeg ett antal gånger och installerat ett antal ubuntu paket såsom libamrnb3 libamrnb-dev libamrwb-dev libamrwb3 amrwb amrnb liblame-dev libxvidcore4-dev libfaac-dev libfaad2-dev för att bara nämna några så börjar det att ljusna.

ffmpeg -v ger mig nu:

FFmpeg version SVN-r14864, Copyright (c) 2000-2008 Fabrice Bellard, et al.
configuration: –enable-gpl –enable-nonfree –enable-swscale –enable-avfilter –enable-pthreads –enable-liba52 –enable-libamr-nb –enable-libamr-wb –enable-libmp3lame –enable-libgsm –enable-libmp3lame –enable-libvorbis –enable-libx264 –enable-libfaac –enable-static

Och det går betydligt lättare att konvertera mellan en massa videoformat.