YubiKeys, SSH, PAM en LDAP

Hoe tweeweg authenticatie op te zetten voor SSH logins met behulp van YubiKeys, PAM en LDAP (via SSL) op een Ubuntu 12.04 installatie.

Benodigde pakketjes

sudo apt-get install ldap-auth-client libpam-yubico

Conflicterende pakketjes

Mocht het pakketje nscd geïnstalleerd zijn, deïnstalleer deze. Dit pakket verhindert een goede werking van de YubiKey-LDAP authenticatiemethode.

ldap-auth-config

Tijdens het installeren van het pakketje ldap-auth-client wordt er een aantal gegevens gevraagd. Doorloop de set-up als volgt:

  • LDAP server Uniform Resource Identifier: ldaps://fqdn.van.ldap.server:poortnummer
  • Distinguished name of the search base: dc=voorbeeld,dc=com
  • LDAP version to use: 3
  • Make local root Database admin: No
  • Does the LDAP database require login? No

/etc/ldap.conf

Dit bestand regelt de verbinding met je LDAP server. De setup van ldap-auth-client heeft de boel nu ingesteld maar eigenlijk heb je deze hele setup niet nodig want met een /etc/ldap.conf met de volgende drie regels ben je er ook:

base dc=voorbeeld,dc=com
uri ldaps://fqdn.ban.ldap.server:poortnummer
tls_cacertfile /etc/ssl/certs/cacert.org.pem

Je kunt dus een deel van wat de setup heeft aangemaakt laten staan, de rest kun je uithekken. Zoals je ziet heb ik voor de SSL kant van het verhaal voor CAcert.org gekozen als CA. Je moet dan ook expliciet verwijzen naar de root certificaten van CAcert.org anders kan er niet gebind worden met de LDAP server. De LDAP server, in mijn geval een OpenDJ directory server, maakt dus gebruik van door CAcert.org getekende certifcaten.

/etc/nsswitch.conf

Dit bestand regelt op welke manier en in welke volgorde de verschillende nameservices worden aangesproken. In ons geval gaat het om de entries password, shadow en groups in dit bestand. Standaard staan die in Ubuntu 12.04 op compat. Om Ubuntu eerst de fysieke bestanden en daarna LDAP te laten checken moet compat veranderd worden in files ldap. Dit gaat het snelst met een sed commando:

sudo sed -i 's/compat/files ldap/g' /etc/nsswitch.conf

Nu /etc/nsswitch.conf is ingesteld kun je gaan testen of je LDAP connectie goed is:

id ldapgebruiker
getent passwd
getent group

PAM

Nu is het zaak PAM zo in te stellen dat je zowel tegenover de Yubico servers authenticeert met je YubiKey als tegenover LDAP wanneer je SSH’t naar je machine. Dit regel je in /etc/pam.d/sshd:

# PAM configuration for the Secure Shell service

# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
auth       required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
auth       required     pam_env.so envfile=/etc/default/locale

# Yubikey authentication
#
# Allow local accounts for the moment.
auth sufficient pam_unix.so

# Fetch LDAP password + OTP, verify OTP and move on ('required' control value).
# LDAP password is stripped and passed on.
auth required pam_yubico.so id=1234 ldap_uri=ldaps://fqdn.van.ldap.server:poortnummer [ldapdn=ou=People,DC=voorbeeld,DC=com] user_attr=uid yubi_attr=yubikeyid

# LDAP authentication
#
# Verify the LDAP password that has been passed on ('use_first_password' argument)
# and grant access when password gets accepted ('sufficient' control value).
auth sufficient pam_ldap.so use_first_pass

# Standard Un*x authentication.
@include common-auth

# Disallow non-root logins when /etc/nologin exists.
account    required     pam_nologin.so

# Uncomment and edit /etc/security/access.conf if you need to set complex
# access limits that are hard to express in sshd_config.
# account  required     pam_access.so

# Standard Un*x authorization.
@include common-account

# LDAP session
#
# Create homedir for LDAP user if it doesn't exist yet.
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

# Standard Un*x session setup and teardown.
@include common-session

# Print the message of the day upon successful login.
session    optional     pam_motd.so # [1]

# Print the status of the user's mailbox upon successful login.
session    optional     pam_mail.so standard noenv # [1]

# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so

# Set up SELinux capabilities (need modified pam)
# session  required     pam_selinux.so multiple

# Standard Un*x password updating.
@include common-password

De dikgedrukte gedeeltes zijn toegevoegd. Het id wat is toegevoegd bij de pam_yubico.so module kun je aanvragen via Yubico. Dit id is de zgn. API Key. Ook heb ik een extra opties toegevoegd:

yubi_attr=yubikeyid

Wat dit doet is de mapping gebruiker – YubiKey Public ID checken op de LDAP server, dus niet op de machine zelf. Het gros van de handleidingen gaat ervan uit dat je de mappings op de machine zelf maakt in platte bestandjes. Maar dat wil je helemaal niet, daar heb je nou juist je LDAP server voor, zodat je dit soort dingen als mappings centraal kan regelen. Wat ik heb gedaan is een objectclass yubikey toegevoegd aan de OpenDJ configuratie en deze een attribute yubikeyid meegegeven. Hoe ik dit heb gedaan komt nog wel aan bod in een latere entry waarin ik ook zal uitleggen hoe je users die in moeten kunnen loggen op je machine moet aanmaken in OpenDJ. De objectclass yubikey heb ik op zijn beurt weer toegevoegd als auxiliary objectclass bij de gebruikers die een YubiKey hebben. Vervolgens kan ik dan in het veld yubikeyid het Public ID ingeven van de YubiKey die bij een bepaalde gebruiker hoort. Het Public ID bestaat uit de eerste 12 tekens van de OTP die een YubiKey genereert. Je kan ook een bestaande attribute gebruiken, Zarafa gebruikt bijvoorbeeld het carLicense attribute. Maar dit gaat er bij mij niet in, een YubiKey Public ID is geen rijbewijs, dus krijgt het een eigen attribute.

Als je nu via SSH inlogt met je LDAP wachtwoord meteen gevolgd door je YubiKey OTP op dezelfde regel zou je keurig geauthenticeerd moeten worden. Eerst tegenover de Yubico Cloud, vervolgens stript de pam_yubico.so module het wachtwoord en haalt het YubiKey OTP eraf en geeft de rest door aan pam_ldap.so die je nu met het overgebleven wachtwoord authenticeert tegenover je LDAP server. En mocht je nog geen home directory hebben dan wordt deze aangemaakt door pam_mkhomedir.so.

YubiKeys, SSH, PAM en LDAP

Asterisk op ARM (SheevaPlug)

De Digium repository heeft geen armel (ARM) pakketjes maar wel de benodigde bronbestandjes zodat je toch op een makkelijke manier de nieuwe releases kunt packagen en installeren. De snelste manier om dat te doen is door de repository van Digium toe te voegen aan je Apt sources:

# echo -e "# Asterisk sourcesn deb-src http://packages.asterisk.org/deb squeeze main"
| tee -a /etc/apt/sources.list

En even iniesniejalieseren:

# apt-get update

En vervolgens kun je met één simpel commando de bronbestanden downloaden, uitpakken en packagen:

apt-get source -b asterisk

Even laten pruttelen en daarna kun je de benodigde pakketten installeren of updaten:

dpkg -i asterisk-config_1.8.11.1-1digium1~squeeze_all.deb
asterisk_1.8.11.1-1digium1~squeeze_armel.deb

Asterisk op ARM (SheevaPlug)

Icidu Wireless Nano Router 150N

We hebben sinds kort een nieuwe Blu-Ray speler met een ethernetaansluiting en de mogelijkheid om draadloos netwerk te kunnen gebruiken mbv. een speciale Wi-Fi adapter. Probleem is alleen dat de netwerkkabel die voorheen in mijn KiSS DP-1500 zat nu in onze Gigaset telefoon zit dus kan de Blu-Ray speler alleen via Wi-Fi in ons netwerk hangen. Die speciale Wi-Fi adapter kost echter een vermogen (meer dan de helft van de oorspronkelijke aanschafprijs!) en uiteraard zijn er geen goedkopere Wi-Fi adapters die het ook doen icm. de Blu-Ray speler. Hoe hang ik nu die Blu-Ray speler in ons netwerk zonder al te veel uit te hoeven geven?

Oplossing: een extra draadloos routertje aanschaffen, deze in het bestaande draadloze netwerk hangen en de ethernetpoort van de Blu-Ray speler verbinden met een ethernetpoort van de router. Hier zijn zelfs specifieke routertjes voor zoals de Netgear Wnce2001 en de Asus WL-330N3G. De goedkoopste is echter de Icidu Wireless Nano Router 150N. Voor een geeltje is deze verkrijgbaar bij diverse toko’s. Heb ‘m zelf bij MyCom besteld en als je de Zalando tegoedbon van een tientje meerekent in de aanschafprijs is ie bij MyCom eigenlijk maar €15,-. En naast dat dit routertje goedkoop is is ie ook superklein en superzuinig.

Goedkoopnessness komt uiteraard met een prijs. De handleiding van de Nano Router gaat uit van een oudere firmware versie en is verre van gedetailleerd en hoewel mijn specifieke usercase genoemd wordt in de handleiding staat nergens uitgelegd hoe je dit in moet regelen. Hieronder dan ook een stappenplan om van de Nano Router een Wi-Fi adapter te maken voor je Blu-Ray/Media- of whateverplayer.

  1. Sluit de LAN poort van de Nano Router met een ethernetkabeltje aan op je PC en voorzie de router van voeding met de bijgeleverde Micro USB kabel
  2. Surf naar de configuratiepagina van de router (192.168.2.1)
  3. Ga naar General SetupWirelessBasic Settings en zet Mode op Station (Infrastructure) en SSID op de SSID van je bestaande Wi-Fi netwerk
  4. Ga vervolgens naar Security Settings en geef hier de authenticatiegegevens van je bestaande Wi-Fi netwerk op
  5. In General SetupLAN vul je bij LAN IP een IP adres in die binnen de range van je bestaande Wi-Fi netwerk valt (en bij voorkeur buiten de DHCP scope van je netwerk) en schakel DHCP uit
  6. Druk op APPLY en in het Save settings succesfully! scherm druk je nog een keer op APPLY
  7. De router herstart nu en zou daarna in het bestaande Wi-Fi netwerk moeten hangen met het LAN IP wat je hebt opgegeven
  8. Sluit nu je Blu-Ray speler aan op het LAN poortje van de router en je speler zou nu via DHCP een IP adress van je hoofdrouter moeten krijgen en het interwebs op moeten kunnen

Edit: waarom trek je gewoon niet nog een kabel? Nou, de router staat op de 1e verdieping en heb de kabels destijds tijdens de verbouwing getrokken. Nu alles verbouwd is wordt het een heidens karwei om een extra kabel te trekken. Een extra routertje is dan een veel snellere oplossing.

Icidu Wireless Nano Router 150N

Asterisk configuratie

We bellen nu thuis via Voipbuster aangezien dat gewoon de goedkoopste aanbieder is. Tientje ex. BTW en dan kun je vier maanden gratis bellen naar een aantal landen (waaronder Nederland en Frankrijk waar mijn ouders wonen). Na die vier maanden ga je de normale tarieven betalen maar die zijn nog steeds zeer aantrekkelijk. Neem Frankrijk, bij Ziggo kost dat €0,08 per minuut met een starttarief van eveneens €0,08. Bij Voipbuster €0,015 en géén starttarief! Ok, bij Voipbuster ronden ze af op de minuut en bij Ziggo rekenen ze per seconde maar dan nog scheelt bellen met Voipbuster aanzienlijk. Bij Voipbuster kun je echter géén lokaal telefoonnummer aanvragen dus dat heb ik bij Budgetphone gedaan. Niet dat dat echt nodig is maar het prepaid abbo van Budgetphone met een lokaal nummer is zo goedkoop (ook een tientje per jaar) dat ik het maar heb aangeschaft, op deze manier kan ik ook thuis lekker klooien met Asterisk en meerdere trunks van verschillende VoIP aanbieders.

Ik gebruik het Asterisk pakketje van Debian Squeeze (1.6.2.9). Heb wel 1.8.8.x geïnstalleerd gehad maar dat werkte niet met Budgetphone aangezien Budgetphone de “From:” SIP headers van deze versie van Asterisk niet accepteerde. Volgens mij werkt het met 1.8.9.2 inmiddels weer wel als ik het Budgetphone forum mag geloven dus wellicht dat ik Asterisk binnenkort ga proberen te updaten. Dus vooralsnog Asterisk 1.6.2.9 met onderstaande configuratie.

/etc/asterisk/sip.conf

[general]
context=default
allowoverlap=no
externip=www.xxx.yyy.zzz
localnet=192.168.1.0/255.255.255.0
bindport=5060
nat=yes
srvlookup=yes
useragent=AutoStatic PBX
disallow=all
allow=alaw
allow=ulaw
allow=g726
allow=ilbc
allow=gsm
allow=g723
allow=g722
allow=g729
language=nl
dtmfmode=auto

;###########################
;## Register    ############
;###########################

#include "/etc/asterisk/register/*.conf"

;###########################
;##  Templates  ############
;###########################

#include "/etc/asterisk/templates/*.conf"

;###########################
;##  Trunks     ############
;###########################

#include "/etc/asterisk/trunks/*.conf"

;###########################
;##  Accounts   ###########
;###########################

#include "/etc/asterisk/accounts/*.conf"

/etc/asterisk/register/budgetphone.conf

register => budgetphonegebruikersnaam:budgetphonewachtwoord@sip1.budgetphone.nl/budgetphonegebruikersnaam

Je Budgetphone gebruikersnaam is tevens je telefoonnummer. Vandaar de schuine streep op het einde met daarachter nog een keer de gebruikersnaam. Op deze manier worden binnenkomende telefoontjes op dat nummer doorgezet naar de gelijknamige context.

/etc/asterisk/trunks/budgetphone.conf

[budgetphone]
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
allow=g722
allow=g729
context=pstn-in
dtmfmode=rfc2833
host=sip1.budgetphone.nl
insecure=port,invite
qualify=yes
type=user

De context voor inkomende telefoontjes op het Budgetphone nummer heet dus pstn-in.

/etc/asterisk/trunks/voipbuster.conf

[voipbuster]
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
context=pstn-out
dtmfmode=rfc2833
host=sip.voipbuster.com
qualify=yes
type=peer
defaultuser=voipbustergebruikersnaam
secret=voipbusterwachtwoord
fromuser=voipbustergebruikersnaam
fromdomain=sip.voipbuster.com

Met Voipbuster bellen we naar buiten, de context heet dan ook pstn-out en we moeten onze gebruikersgegevens opgeven anders accepteert Voipbuster onze telefoontjes niet. Voor Budgetphone is dit niet nodig aangezien we daar alleen telefoontjes mee ontvangen.

/etc/asterisk/templates/phones.conf

[phones](!)
type=friend
qualify=yes
nat=yes
context=phones
host=dynamic
canreinvite=no
dtmfmode=rfc2833
allowtransfer=yes
disallow=all
allow=ulaw
allow=alaw
allow=g726
allow=g723
allow=gsm
allow=g722
allow=g729

Dit sjabloon gebruik ik voor mijn accounts, dan hoef ik dat niet voor iedere account toe te voegen.

/etc/asterisk/extensions.conf

;###########################
;## Contexts    ############
;###########################

#include "/etc/asterisk/contexts/*.conf"

/etc/asterisk/contexts/pstn-in.conf

[pstn-in]
exten => budgetphonetelefoonnummer,1,Dial(SIP/10,25,tT)
 same => n,Hangup()

Oftewel, stuur alles wat binnenkomt op het Budgetphone nummer door naar toestel met extensie 10 (onze Gigaset C610 IP huistelefoon).

/etc/asterisk/contexts/pstn-out.conf

[pstn-out]
exten => _00X.,1,Set(CALLERID(num)=budgetphonetelefoonnummer-internationaalformaat)
 same => n,Dial(SIP/${EXTEN}@voipbuster)
 same => n,Hangup()

exten => _0XXXXXXXXX,1,Set(CALLERID(num)=budgetphonetelefoonnummer-nationaalformaat)
 same => n,Dial(SIP/${EXTEN}@voipbuster)
 same => n,Hangup()

/etc/asterisk/contexts/internal.conf

[internal]
exten => 10,1,Dial(SIP/10,25,tT)
 same => n,Hangup()

exten => 20,1,Dial(SIP/20,25,tT)
 same => n,Hangup()

exten => 30,1,Dial(SIP/30,25,tT)
 same => n,Hangup()

exten => 40,1,Dial(SIP/40,25,tT)
 same => n,Hangup()

De interne extensies zodat er ook intern gebeld kan worden. Extensie 10 wordt gebruikt voor binnenkomende telefoontjes die van Budgetphone vandaan komen.

/etc/asterisk/contexts/phones.conf

[phones]
include => internal
include => pstn-in
include => pstn-out

De phones context die alle andere contexts ‘include’.

/etc/asterisk/accounts/10.conf

[10](phones)
callerid=Thuis <10>
secret=***

(phones) geeft aan dat voor dit account het phones sjabloon gebruikt moet worden. In de /etc/asterisk/accounts directory staan verder nog configuratiebestandjes voor mijn mobiele telefoon, mijn werktelefoon en mijn softphone applicatie.

Er kunnen nog wat fouten zitten in bovenstaande configuratie. En ik moet nog even goed kijken naar de codecs, volgens mij is dat nu nog een rommeltje.

Asterisk configuratie

ZynAddSubFX documentatie

De ZynAddSubFX Wiki doet het niet, de beschikbare documentatie staat vol spelfouten en kromme zinnen en de screenshots zien er een beetje gedateerd uit. Dus heb de bezem er door heen gehaald, de boel afgestoft en waar mogelijk de boel bijgewerkt. Zou zonde zijn als er niks meer met deze bestaande en gedegen documentatie gedaan zou worden.

ZynAddSubFX Manual in de LinuxMusicians Wiki

ZynAddSubFX Manual ODT bestand

ZynAddSubFX Manual PDF bestand

Welllicht ten overvloede, ik heb geen woord zelf geschreven van deze documentatie, ik heb het alleen geconverteerd naar bovenstaande bestanden en naar een DokuWiki pagina. De gehele inhoud is van de hand van de maker van ZynAddSubFX, Paul Nasca Octavian.

ZynAddSubFX documentatie

Handleidingen geüpdatet

De handleidingen voor het configureren van je systeem en het gebruiken van een FireWire geluidskaart met Ubuntu zijn bijgewerkt en weer up to date. Ik had hier wat feedback op gekregen, waarvoor mijn dank. Ik krijg het idee dat steeds meer mensen muziek beginnen te maken met GNU/Linux en de mogelijkheden ontdekken van JACK en de modulaire Linux audio omgeving. Het kost inderdaad wat tijd om het allemaal onder de knie te krijgen (maar geldt niet hetzelfde voor een Ableton of een Cubase?) maar je krijgt er veel voor terug.

Handleidingen geüpdatet

Yoshimi: meerdere instruments tegelijk gebruiken

Voor sommige van mijn ideeën heb ik meerdere instruments nodig uit Yoshimi. Voorheen loste ik dit op door meerdere Yoshimi’s op te starten maar dan wordt het al snel onoverzichtelijk. En had ergens gelezen dat het mogelijk is om in Yoshimi of ZynAddSubFX meerdere instrumenten tegelijk te gebruiken. Nooit echt naar gekeken en het is dus eigenlijk dodelijk simpel maar nergens goed gedocumenteerd.

Met Yoshimi is het mogelijk meerdere parts te gebruiken, 16 in totaal. En dat is het eigenlijk. In iedere part kun je een andere instrument laden en aangeven op welk MIDI kanaal deze moet luisteren. Even wat screenshotjes om de boel te verduidelijken. Heb het deel van de GUI waar het om gaat gemarkeerd met een rode rand.







Part 1 zit dus op MIDI kanaal 1 en part 2 op kanaal 2. In bijv. Qtractor kun je ze nu apart aansturen. Als je de parts tegelijkertijd wil laten spelen zet je ze op hetzelfde MIDI kanaal. Het is wel belangrijk dat je de verschillende parts activeert (enable aanvinken) anders kun je er geen instruments in laden.

Yoshimi: meerdere instruments tegelijk gebruiken

Vocoder in Qtractor II

Heb even een sjabloontje gemaakt in Qtractor om snel een sessie op te kunnen starten met de Vocoder LADSPA plugin.

Qtractor + Vocoder

Mocht je dit sjabloontje willen gebruiken hou er dan rekening mee dat je dan de werkdirectory aan moet passen (regel 4) en dat het sessiebestandje gemaakt is op een 64-bits installatie (regel 254). En je moet de Vocoder LADSPA plugin geïnstalleerd hebben uiteraard.

Vocoder in Qtractor II

Vocoder in Qtractor

Op bijna dezelfde manier als de sidechain compressie methode kun je ook de Vocoder LADSPA plugin gebruiken. Ik ben hiermee gaan experimenteren na een vraag van Louigi Verona op de Linux Audio Developer mailing list en heb de Vocoder als volgt aan de gang gekregen:

  • In Qtractor heb ik 4 tracks aangemaakt met daarbij behorende bussen: Formant Synth (1 kanaal), Carrier Voice (1 kanaal), Vocoder (2 kanalen) en Vocoder Mix (2 kanalen)
  • Alle tracks hebben zowel als in- en output hun corresponderende bussen behalve Vocoder Mix, die stuurt uit naar de Master bus
  • In de Vocoder track heb ik de Vocoder LADSPA plugin geladen, input 1 van de Vocoder bus is de carrier en input 2 is de formant (formant, carrier?)
  • Daarna heb ik de connecties aangemaakt zoals in de onderstaande schermafdruk




In Yoshimi heb de Trash Guitar 1 instrument geladen en als ik nu in het microfoontje van mijn notebook spreek en wat noten aansla met het virtuele keyboard van Yoshimi hoor ik mijn stem gevocode weer terug. Hiervoor moet je in de Vocoder plugin settings wel het aantal bands selecteren dat je wilt gebruiken en deze openzetten zoals in onderstaande schermafdruk te zien is.


http://lists.linuxaudio.org/pipermail/linux-audio-dev/2010-July/028433.html


Inmiddels is er ook een mailtje binnengekomen op de LAD mailing list van de ontwikkelaar van Qtractor zelf, Rui Nuno Capela. Eigenlijk wilde hij Louigi melden dat wat hij wil helemaal niet kan in Qtractor maar na mijn mailtje met uitleg gelezen te hebben komt hij daar van terug en geeft in zijn PS aan dat ik zijn programma kennelijk al beter ken dan hijzelf.

*glim*

Vocoder in Qtractor