Cool bash prompt

Flg. bash prompt (indsæt den i .basrc i dit homedir) har jeg tyvstjålet og tilpasset lidt selv:

set_prompt () {                                                                         
    Last_Command=$? # Must come first!                                                  
    Blue='\[\e[01;34m\]'                                                                
    White='\[\e[01;37m\]'                                                               
    Red='\[\e[01;31m\]'                                                                 
    BRed='\e[1;31m'         # Red                                                       
    Green='\[\e[01;32m\]'                                                               
    Reset='\[\e[00m\]'                                                                  
    FancyX='\342\234\227'                                                               
    Checkmark='\342\234\223'                                                            
    Yellow='\e[0;33m'                                                                   
    BYellow='\e[1;33m'      # Yellow                                                    
    BCyan='\e[1;36m'        # Cyan                                                      
    BPurple='\e[1;35m'      # Purple                                                    
    BGreen='\e[1;32m'       # Green                                                     
                                                                                        
    PS1=""                                                                              
                                                                                        
    if [[ $Last_Command == 0 ]]; then                                                   
        PS1+="\[${Green}\]\[${Checkmark}\] "                                            
    else                                                                                
        PS1+="\[${Red}\]\[${FancyX}\] "                                                 
    fi                                                                                  
                                                                                        
    if [[ $EUID == 0 ]]; then                                                           
        PS1+="\[${BRed}\]\\u\[${BYellow}\]@\[${BCyan}\]\$(hostname -f) "                
    else                                                                                
        PS1+="$BGreen\\u$BYellow@${BCyan}\[\$(hostname -f)\] "                          
    fi                                                                                  
                                                                                        
    PS1+="\[${BYellow}\]\w \[${BPurple}\]# $Reset"                                      
}                                                                                       
PROMPT_COMMAND='set_prompt'

Den viser dels hvorvidt sidste kommando kørte successfyldt (exitcode == 0) eller ej, ligesom den viser fqdn istedet for blot hostname og slutteligt bliver brugernavnet rødt hvis du er root …

Hvis du selv vil være kreativ så kan du selv lege videre, jeg stjal 80% af min prompt her : https://wiki.archlinux.org/index.php/Color_Bash_Prompt

Udgivet i Knowledge Base, Linux, Old Base | Skriv en kommentar

Automatiske SSH Tuneller (autossh)

Eller med andre ord, en guide til at tilgå udstyr uden offentlige IPv4 adresser, det er en nyttig ting når man som mig har mange kunder med udstyr der skal passes men som ikke har behov for at kunne blive tilgået udefra normalt.

Det er jo en klassisk situation hvor en SSH Tunnel er rar at have, det er bare monster besværligt at skulle sætte den op og holde den kørende, den lukker jo ned hvis du kke bruger den – og hvis ikke lige du er i nærheden skal du guide kunden til at sætte den op. Det er noget rod, derfor har jeg strikket en løsning sammen som jeg syntes virker ok.

Situationen er den at jeg vil have fat i min kundes server, begge maskiner er på RFC1918 Adesser (dvs 10.x.x.x/8 og 192.168.x.x/24) og kan således ikke snakke direkte sammen, derfor introducerer jeg en jumpserver som jeg har tænkt mig at få til at “ligne” min kundes server udefra.

Mht. sikkerhed så skal den selvfølgelig firewalles fornuftigt, men det er så simpelt at jeg ikke gider gennemgå det her 🙂

Først starter vi med at generere en ssh nøgle på kundens server, for den skal kunne logge ind på “JumpServer” automatisk.

KundensServer# ssh-keygen -t rsa

Du kan roligt acceptere alle standardforslagene, dvs. trykke enter et par gange. Når du er færdig så kopier /root/.ssh/id_pub.rsa til JumpServer /root/.ssh/authorized_keys, test herefter:

KundensServer# ssh root@JumpServer

Såfremt det virker er vi klar til at fortsætte med næste skridt:

JumpServer# vim /etc/ssh/sshd_config

Og skift “Port 22” til “Port 2222” og tilføj “GatewayPorts Yes” i bunden af filen, gem den og genstart ssh:

JumpServer# /etc/init.d/ssh restart

Vend herefter tilbage til kundensserver og installer autossh:

KundensServer# apt-get install autossh

Dernæst har jeg strikket et lille fattigmandsscript sammen til dig, det antager at der ikke er andre processer der hedder “autossh”, og hvis der er det alligevel bliver de dræbt samtidig med at du evt. dræber den her tunnel.

#!/bin/bash

### BEGIN INIT INFO
# Provides:          tunnel 
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the tunnel
# Description:       starts the tunnel
### END INIT INFO

case "$1" in
  start)
    echo "Starting tunnels "
        autossh -M 0 -q -f -N -p 2222 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R *:22:localhost:22 root@JUMPSERVER
        autossh -M 0 -q -f -N -p 2222 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R *:80:localhost:80 root@JUMPSERVER
    ;;
  stop)
    echo "Stopping tunnels "
    killall autossh
    ;;
  restart)
    echo "Restarting firewall"
    /etc/init.d/firewall stop
    sleep 1
    /etc/init.d/firewall start
    ;;
  *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|status}" >&2
    exit 1
    ;;
esac

exit 0

Parametrene til autossh kort forklaret:

* -M 0, vælger hvilken metode autossh skal benytte for at holde øje med om forbindelsen er i live, her har vi valgt metode 0 fordi vi bruger SSH’s egen indbyggede.
* -q for quiet, -f for at forke til en baggrundsprocess -N for ikke at udføre en kommando på destinationsmaskinen (som er standard opførsel)
* -p 2222 fortæller at vi skal forbinde _til_ port 2222 på destinationsmaskinen, fordi vi jo ændrede ssh’s port.
ServerAliveInterval og ServerAliveCountMax er ssh’s indbyggede løsning på ustabile forbindelser, hvis forbindelsen mistes afbryder ssh og autossh genstarter så forbindelsen.
* -R *:22 betyder at den skal binde sig til port 22 på JumpHost og localhost:22 betyder at den anden ende af tunellen skal ende på localhost port 22

Når det script kører kan du forbinde til din kundes server ved at skrive:

klient1# ssh bruger@jumpserver

og du kan taste http://jumpserver i din browser, og få maskinens hjemmeside at se. Tilføj selv flere porte efter behov 🙂

Når du er tilfreds automatiseres processen ved at skrive:

KundensServer# update-rc.d tunnel defaults

Nu vil tunnelen starte af sig selv hvergang maskinen booter, jeg kan kun anbefale løsningen. Jeg bruger det selv og det er pænt stabilt 🙂

Udgivet i Knowledge Base, Linux, Networking, Old Base | Skriv en kommentar

HTML5 Template med JQuery, Fixed footer og Responsiveness

Frontend webkode er som regel ikke noget jeg gør friviligt, men når det sker er det rart at have en template at starte ud fra, og endelig har jeg taget mig sammen til at lavet et nyt opdateret template.

Dette blogindlæg er egentlig mest lavet for min egen skyld, men det kan selvfølgelig også hjælpe andre.

Fremgangsmåde: (download html5.tgz, https://www.unifix.org/files/html5.tar)

1) Opret index.html og put nedstående kode i den
2) Opret style.css og tag indholdet mellem <style></style> tag’et og lægi style.css
3) Hent reset stylesheet ( http://meyerweb.com/eric/tools/css/reset/ ), og put det i reset.css
4) Inkluder reset.css og style.css i index.html med:

<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="style.css">

5) Start coding! 🙂

<!DOCTYPE HTML>
<html>
        <head>
                <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

                <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
                <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>

                <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <title>HTML5 Template</title>
                <style>
                        @media (min-width: 600px) and (max-width: 950px) {
                                #body { font-size: 50px; }
                        }       
                        html, body {
                                margin: 0;
                                padding: 0;
                                height: 100%;
                        }   
                        #page {
                                min-height: 100%;
                                position: relative;
                                background-color: #bbb; 
                        }   
                        #header {
                                border: 1px solid red;
                                background-color: red;
                        }   
                        #body {
                                padding-bottom: 100px;
                                background-color: green;
                        }   
                        #footer {
                                width: 100%;
                                height: 100px;
                                position: absolute;
                                background-color: blue;
                                bottom: 0;
                        }   
                </style>
        </head>
        <body>
                <div id="page">
                        <div id="header">
                                header
                        </div>
                        <div id="body">
                                body
                        </div>
                        <div id="footer">
                                footer
                        </div>
                </div>
        </body>
</html>

 

Udgivet i Knowledge Base, Linux, Old Base, Programmering | Skriv en kommentar

Create Strong passwords in BASH Script

OK, this has been answered a couple of times before:

http://unifix.org/cgi-bin/index.pl?action=show&ID=193
http://unifix.org/cgi-bin/index.pl?action=show&ID=203

But none of those scripts actually test for password strength :-)

Debug mode:

LOOP=1
PASSWORD=""
until [[ $PASSWORD =~ [a-z].*[a-z] ]] && [[ $PASSWORD =~ [A-Z].*[A-Z] ]] && [[ $PASSWORD =~ [0-9].*[0-9] ]]
do 
   PASSWORD=$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c${1:-8})
   echo $LOOP
   LOOP=$(($LOOP+1))
done
echo $PASSWORD

Most of the time I get a strong password in max 5 to 7 loops.
The record was 21 (wtf debian? RNG broken again?)

Actual scrip snippet:

create_password() {
   PASSWORD=""
   until [[ $PASSWORD =~ [a-z].*[a-z] ]] && [[ $PASSWORD =~ [A-Z].*[A-Z] ]] && [[ $PASSWORD =~ [0-9].*[0-9] ]]
   do 
      PASSWORD=$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c${1:-8})
   done
   echo "$PASSWORD"
}

NEW_USER_PASSWORD=$(create_password)

Success!
Udgivet i Knowledge Base | Skriv en kommentar

Intro til Screen – Kør ting i baggrunden

Screen er et program der lader dig starte et andet program, og køre dette i baggrunden – det kan f.eks. bruges til at lade et program køre selvom din ssh forbindelse bliver afbrudt.

Start med at installere screen:

# apt-get install screen

Nu kan du starte screen:

# screen -S test

Herefter får du flg. skærmbillede:

Screen version 4.00.03jw4 (FAU) 2-May-06

Copyright (c) 1993-2002 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General
Public License as published by the Free Software Foundation; either version 2, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along with this program (see the file
COPYING); if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to screen@uni-erlangen.de

                                       [Press Space or 
Return to end.

Tryk nu enter og du står ved en kommando-prompt, start dit program … f.eks. vim, og tryk herefter CTRL + A + D (CTRL + A Samtidig, slip dem og tryk så D) herefter kommer du tilbage til den prompt du stod i da du startede screen.

Nu kan du så vælge at starte en ny screen, eller re-attache den du lige har startet ved at skrive:

# screen -r

Hvis du kun har en screen kørende vil du blive returneret til denne, hvis du har mere end én screen får du istedet flg. resultat:

# screen -r
There are several suitable screens on:
  5933.test2	(04-10-2013 09:23:16)	(Detached)
  5917.test1	(04-10-2013 09:23:16)	(Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Og du kan nu vælge hvilken screen du vil genskabe, feks.:

# screen -r test1

Alt hvad der foregår inde i en screen vil overleve at din ssh forbindelse bliver tabt, og processen vil køre videre hvad enten det er en editor eller et script du selv har lavet.

God fornøjelse.

Udgivet i Knowledge Base, Linux, Old Base | Skriv en kommentar

Giv kunderne magten tilbage, Sudo adgang til trivielle opgaver

Tit og ofte har du en kunde som bliver ved med at crashe sin egen database, eller hvis Apache server fra tid til anden bliver overbelastet fordi de deployer utestet kode eller lign.

Den slags support opgaver er belastende for både dig og kunden, derfor har jeg for længe siden tillagt mig den vane at give kunden adgang til selv at fikse det.

Første skridt er at installere sudo:

apt-get install sudo

Herefter opretter jeg flg. linie i min /etc/sudoers

www-data        ALL = (root) NOPASSWD: /etc/init.d/mysql restart

Og som du kan se har jeg sat www-data brugeren ind … hvis dín kunde har SSH Adgang kan du selvfølgelig nøjes med at angive kundens brugernavn her og så er du færdig – det er dog ikke alle kunder der har det, så jeg laver et hurtigt webinterface.

Først en webserver:

apt-get install apache2 libapache2-mod-php5

Så skal vi have sat et lille password på for god ordens skyld:

vim /etc/apache2/sites-enabled/000-default

og ret AllowOverride til i Directoy blokken for /var/www:

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride AuthConfig
                Order allow,deny
                allow from all
        </Directory>

Genstart Apache:

root@mysql:~# /etc/init.d/apache2 restart
[ ok ] Restarting web server: apache2 ... waiting .

Opret /var/www/.htaccess og indsæt flg:

AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /var/www-passwd
Require valid-user

Og opret herefter /var/www-passwd med et brugernavn og et password i til kunden:

htpasswd -c /var/www-passwd kunde
New password: <kode>
Re-type new password: <kode gentaget> 
Adding password for user kunde

Så kaster vi lige et par liniers php kode sammen i /var/www/index.php:

<h1>Kontrolpanel</h2>
<a href="?genstart=mysql" onclick="return confirm('Dette vil genstarte MySQL\nEr du sikker?');">Genstart MySQL</a>
<?
if ($_REQUEST["genstart"] == "mysql")
{
print "<div style='clear: both;'></div><div style='background-color: black; float: left; padding: 25px; color: #93fe40;'><pre>";
system("sudo /etc/init.d/mysql restart");
print "</pre></div>";
}
?>

Resultat:

Jeg plejer lige et smide et mail statement ind så jeg også får en mail når kunden gør det … bare så jeg har lidt styr på hvad der sker, i tilfælde af at de ringer til mig bagefter og skal have hjælp, indsæt den her mellem linie 5 og 6:

mail("mikkel@mikjaer.com","MySQL Restartet by customer on ".exec("hostname -f")." from ".$_SERVER["REMOTE_ADDR"],"");

Du kan selvfølgelig selv udvide den med alle de knapper du, og dine kunder, måtte ønske dig 🙂

Udgivet i Knowledge Base, Linux, Old Base | Skriv en kommentar

Nagios modul til overvågning af antal MySQL Connections

Jeg har gemt selve modulet i /opt/nagios/mysql_conn.php:

#!/usr/bin/php
<?
# Copyright (c) 2013 Mikkel Mikjaer Christensen

function get_args()
{
        global $argv;
        $a = $argv;
        unset($a[0]);
        $b = preg_split("/-/",implode(" ",$a),NULL,PREG_SPLIT_NO_EMPTY);
        foreach ($b as $_)
        {
                $c = preg_split("/ /",$_,NULL,PREG_SPLIT_NO_EMPTY);
                $ret[$c[0]]=$c[1];
        }
        return $ret;
}
$a = get_args();
$warning = $a["w"];
$critical = $a["c"];

mysql_connect("localhost","root","p3wOgsq8");
$conn = mysql_num_rows(mysql_query("show processlist"));

if ($conn >= $critical)
{       
        print "CRITICAL, MySQL Connections: $conn\n";
        die(2);
} else if ($conn >= $warning) {
        print "WARNING, MySQL Connections: $conn\n";
        die(1);
} else {
        print "OK, MySQL Connections: $conn\n";
        die(0);
}
?>

Jeg satte den op via nrpe, så på min mysql server i /etc/nagios/nrpe.cfg indsatte jeg flg. linie:
command[check_mysql_conn]=/opt/nagios/mysql_conn.php -w 300 -c 400

og på nagios serveren tilføjede jeg flg. i /etc/nagios-plugins/config/nrpe.cfg:

define command{
        command_name    check_mysql_conn
        command_line    /usr/lib/nagios/plugins/check_nrpe -H '$HOSTADDRESS$' -c check_mysql_conn -u # -w 30
}

og til sidst kan du oprette flg. service-definition:

define service{
        use                     generic-service         ; Inherit default values from a template
        host_name               mysql.example.com
        service_description     Current MySQL Connections
        check_command           check_mysql_conn
        }

 

Udgivet i Knowledge Base, Linux, Monitoring, Mysql, Nagios, Old Base | Skriv en kommentar

Overvåg dine SSL Certifikater med Nagios

Det er ikke bare hamrende uprofessionelt men det er også mega irriterende når ens SSL Certifikater udløber og man ikke opdater det - for det første har man jo sat ind i sin kalender når certifikatet skal fornyes men det kan jo være den smutter.

Derfor er jeg særligt glad for det her plugin til Nagios:


define command{
   command_name    check_https
   command_line    /usr/lib/nagios/plugins/check_http --ssl -C 14 -H '$HOSTADDRESS$' -I '$HOSTADDRESS$'
}
 Ovenstående command-definition til Nagios sender en Critical-warning 14 dage før certifikatet udløber - hvilket i langt de fleste tilfælde er riiigeligt til at få dem opdateret.
Udgivet i Knowledge Base, Nagios | Skriv en kommentar

DDoS Attack Stats

This of course only works, if you still have access to the machine.
Local access or out of band remote access would be required, if you really were under attack.

#!/bin/sh

# Regex that maches the attackers browserstring, 
# or prehaps the URL attacked, if it is possible to match.
BROWSERSTRING="008\/0\.85"
# The current log file
LOGFILE="/var/log/apache/access.log"

echo "List of highest attacking IP's"
grep ${BROWSERSTRING} ${LOGFILE} | awk '{print $1}' | sort | uniq -c | sort | tail -n 10

echo "Total number of attackers"
grep ${BROWSERSTRING} ${LOGFILE} | awk '{print $1}' | sort | uniq -c | sort | wc -l

echo "Time of first contact"
grep ${BROWSERSTRING} ${LOGFILE} | awk -F \  '{print $4 $5}' | sort | head -n 1

echo "Time of last contact"
grep ${BROWSERSTRING} ${LOGFILE} | awk -F \  '{print $4 $5}' | sort | tail -n 1
Udgivet i Knowledge Base | Skriv en kommentar

Find XML part in files

If you have a lot of XML files, like Magento Module Config Files, and need to find a code snippet, like the Crontab definitions in all files, try this:

find . -name '*.xml' | xargs awk '/<crontab>/,/<\/crontab>/{print FILENAME, $0; nextfile}'

It might also come in handy in Apache config files or other XML based config systems...
Udgivet i Knowledge Base | Skriv en kommentar