16 May 2019

Ala ala Google Single Sing On dengan simplesamlphp

Ceritanya bulan puasa lagi dapet ide buat bikin aplikasi Single Sign On ala ala google gitu. Bisa nggak sih? masa google bisa kita nggak bisa nyerempet dikit ye kan. Dulu sampe sekarang lagi mainan simplesamlphp. Tapi sampai saat ini kebutuhannya hanya untuk autentikasi ke Google Application for Education. Ala ala single sign on, tapi baru id dan passwordnya aja yang satu. Tapi, setiap masuk aplikasi harus login dulu dengan masukin user password. Jadi bisa di bilang baru single identity aja kali ya bukan single sign on.

Nah, mencoba mendalami soal simplesamlphp ini, ternyata dia bisa kayak gitu. Kayaknya seru ngoprek, sekalian aja dokumentasinya gue tulis disini. Kali aja kan nanti ada yang butuh. Sedikit penjelasan sih simplesamlphp ini menggukan konsep SAML2 untuk metode autentikasinya. Apa itu SAML2? Mungkin baca baca aja ya di google. Atau, mungkin nanti di kemudian hari kita coba bahas apa itu saml2. Tapi, nggak sekarang. karena sekarang saya akan bahas menggunakan simplesamlphp untuk autentikasi single sign on ala ala google.

Apa aja alat dan bahannya? Oke, disini saya akan lampirkan:

  • Sistem Operasi Centos 7 (Running Well)
  • Nginx
  • PHP 7.1
  • DNS
  • simplesamlphp (https://github.com/simplesamlphp/simplesamlphp.git)
  • host : oneid.hanangpriambodo.com/simplesaml
  • host : alfatih.hanangpriambodo.com/simplesaml
  • host : ayyubi.hanangpriambodo.com/simplesaml

Karena ini hanya uji coba,jadi saya hanya menggunakan satu komputer dengan sistem operasi centos 7. Di dalamnya nanti saya install webserver nginx untuk menjalankan 3 host (oneid, alfatih, ayyubi).

Sebelum kita installasi, komputer perlu untuk koneksi ke internet. Kemudian kita awali dengan membuat direktori dan modul yang di perlukan.

yum install php-xml php-krb5 php-common php-fpm php-mbstring php-cli php-zip php-mysql php-ldap php-devel php-pear php-curl
mkdir -p /data/alfatih /data/oneid /data/ayyubi
cd /data
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
HASH="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Instalasi dan konfigurasi NGINX

Kita harus instalasi webserver terlebih dahulu karena simplesamlphp berjalan di atas web. Untuk artikel ini saya akan menggunakan nginx untuk webserver simplesamlphp. Untuk tahapan instalasi dan konfigurasi adalah sebagai berikut :

  • instalasi nginx
    yum install nginx -y
  • buat file konfigurasi host nginx
    vi /etc/nginx/conf.d/hanangpriambodo.conf
    server {
    listen 80;
    server_name oneid.hanangpriambodo.com;
    root /data/oneid;
    index index.php index.html index.htm;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    keepalive_timeout 100;
    keepalive_requests 1000;
    location / {
    rewrite ^(/simplesaml/?)(.*) /data/oneid/simplesaml/www/$2 break;
    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9001;
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }
    location /simplesaml {
    alias /data/oneid/simplesaml/www;
    index index.php;
    try_files $uri $uri/ /index.php?args;
    location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
    fastcgi_param PATH_INFO $pathinfo if_not_empty;
    include fastcgi_params;
    }
    }
    }
    server {
    listen 80;
    server_name alfatih.hanangpriambodo.com;
    root /data/alfatih;
    index index.php index.html index.htm;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    keepalive_timeout 100;
    keepalive_requests 1000;
    location / {
    rewrite ^(/simplesaml/?)(.*) /data/alfatih/simplesaml/www/$2 break;
    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }
    location /simplesaml {
    alias /data/alfatih/simplesaml/www;
    index index.php;
    try_files $uri $uri/ /index.php?args;
    location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
    fastcgi_param PATH_INFO $pathinfo if_not_empty;
    include fastcgi_params;
    }
    }
    }
    server {
    listen 80;
    server_name ayyubi.hanangpriambodo.com;
    root /data/ayyubi;
    index index.php index.html index.htm;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    keepalive_timeout 100;
    keepalive_requests 1000;
    location / {
    rewrite ^(/simplesaml/?)(.*) /data/ayyubi/simplesaml/www/$2 break;
    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }
    location /simplesaml {
    alias /data/ayyubi/simplesaml/www;
    index index.php;
    try_files $uri $uri/ /index.php?args;
    location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
    fastcgi_param PATH_INFO $pathinfo if_not_empty;
    include fastcgi_params;
    }
    }
    }
  • Simpan dan keluar.
  • Jalankan php-fpm
    service php-fpm start
  • Kemudian jalankan nginx
    service nginx start
  • Jadikan php-fpm dan nginx berjalan setiap start komputer
    chkconfig php-fpm on
    chkconfig nginx on

Install Simplesamlphp pada oneid (Identity Provide)

Pertama kita lakukan instalasi pada host oneid.hanangpriambodo.com. oneid ini kita peruntukan sebagai portal login seperti accounts.google.com gitu. tapi ini belum bisa multi accountnya. namanya juga uji coba.

Kita langsung saja ya proses instalasi

  • masuk kedalam direktori oneid yang telah di buat
    cd  /data/oneid
  • clone simplesaml menggunakan url git
    git clone https://github.com/simplesamlphp/simplesamlphp
  • masuk kedalam folder simplesaml
    cd simplesaml
  • buat direktori cert
    mkdir cert
  • lakukan composer install
    composer install
  • copy config dari config-template
    cp -a config-templates/* config
  • cp simplesaml/metadata-templates simplesaml/metadata
    cp -a metadata-templates/* metadata
  • kemudian masuk kedalam config.php
    vi config/config.php
  • ubah ‘enable.saml20-idp’ => false, menjadi true
    'enable.saml20-idp' => true,
  • buat direktory cert di dalam direktori simplesaml
    mkdir cert
  • buat sertifikat
    openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out oneid.hanangpriambodo.crt -keyout oneid.hanangpriambodo.pem
  • pindahkan sertifikat ke direktori cert
    mv oneid.hanangpriambodo.* cert/
  • ubah crt dan pem pada metadata/saml20-idp-hosted.php menjadi nama sertifikat yang telah di buat
    vi metadata/saml20-idp-hosted.php
    // X.509 key and certificate. Relative to the cert directory.
    'privatekey' => 'server.pem',
    'certificate' => 'server.crt',
  • Kemudian pada file yang sama, cari kalimat di bawa ini hapus koment yang di cetak tebal.
    /* Uncomment the following to use the uri NameFormat on attributes. */
    /* <- hapus ini
    'attributes.NameFormat' => 'urn:oasis:names:tc:SAML:2.0:attrname-format:uri',
    'authproc' => [
    // Convert LDAP names to oids.
    100 => ['class' => 'core:AttributeMap', 'name2oid'],
    ],
    */ <- hapus ini
  • simpan dan keluar
  • Kemudian konfigurasi sumber autentikasi yang ada pada file config/authsources.php
  • Kali ini kita coba dengan contoh autentikasi dengan nama example-userpass. Buka file config/authsources.php, kemudian cari example-userpass. Hapus komen yang di cetak tebal bawah ini
    vi config/authsources.php
    /* <- hapus ini
    'example-userpass' => [
    'exampleauth:UserPass',
    // Give the user an option to save their username for future login attempts
    // And when enabled, what should the default be, to save the username or not
    //'remember.username.enabled' => false,
    //'remember.username.checked' => false,
    'student:studentpass' => [
    'uid' => ['test'],
    'eduPersonAffiliation' => ['member', 'student'],
    ],
    'employee:employeepass' => [
    'uid' => ['employee'],
    'eduPersonAffiliation' => ['member', 'employee'],
    ],
    ],
    */ <-hapus ini
  • Simpan dan keluar

Ujicoba oneid.hanangpriambodo.com

Instalasi oneid.hanangpriambodo.com sebagai identity provider telah selesai. Selanjutnya adalah ujicoba apakah web ini berjalan dengan baik dan lancar.

Buka url http://oneid.hanangpriambodo.com/simplesaml pada browser

kemudian pilih bagian Configuration jika pada bagian kanan saml20 cheklist hijau maka saml20 sudah aktif.

Selanjutanya uji coba autentikasi dengan memilih menu Authentication kemudian pilih Test configured authentication sources . Akan ada beberapa menu. Pilih example-userpass.

Pada example-userpass ada 2 user yang aktif :

  1. employee dengan password employeepass
  2. user student dengan password studentpass

Lakukan pada salah satu user klik menu login. Jika tampil seperti tamplian pada bahwa ini, maka instalasi berasil.

Selanjutnya kita fokus pada menu federation. pada bagian content federation ada menu SAML 2.0 IdP Metadata. bila di klik maka akan ada beberapa informasi untuk konfigurasi ke web service provider atau applikasi web yang mau di sso kan. kalo disini adalah alfatih dan ayyubi.

Kalo di lihat memang membingungkan tapi nanti Insha Allah akan dijelaskan pada tulisan ini hal-hal yang di butuhkan. sampai disini dulu untuk bagian oneid atau sebagia identity provider. selanjutnya kita bahas untuk bagian service provider (alfatih dan ayyubi)

Instalasi SAML2.0 Service Provider pada alfatih dan ayyubi.

Selanjutnya kita akan mengintall simplesamlphp untuk host alfatih.hanangpriambodo.com dan ayyubi.hanangpriambodo.com. Cara install dan kofigurasi keduanya sama, kerena dua host ini sebagai Service Provider yang menggunakan simplesamlphp.

Untuk menginstall tiap host maka kita perlu masuk ke direktori tiap host.

alfatih : cd /data/alfatih

ayyubi : cd /data/ayyubi

di tulisan ini saya contohkan instalasi di host alfatih dengan tahapan sebagai berikut :

  • masuk ke direktory alfatih
    cd /data/alfatih
  • lakukan git clone simplesaml
    git clone https://github.com/simplesamlphp/simplesamlphp
  • masuk kedalam folder simplesaml
    cd simplesaml
  • lakukan composer install
    composer install
  • copy config dari config-template
    cp -a config-templates/* config
  • copy metadata-templates ke metadata
    cp -a metadata-templates/* metadata
  • Jika sudah bila akses url dari brower maka akan tampil web simplesamlphp.

Jika sudah tampil, maka instalasi telah selesai. langkah selanjutnya adalah konfigurasi agar Service Provider (Alfatih dan Ayyubi) terkoneksi dengan Identity Provider (Oneid).

Konfigurasi Service Provider
Pada web Service Provider (Alfatih dan Ayyubi) kita fokus pada beberapa hal :

  1. url untuk melihat metadata pada web Identity Provider (Oneid)
  2. url untuk melihat metadata pada web Service Provider diri sendiri (Alfatih)
  3. file config/authsources.php
  4. file metadata/saml20-idp-remote.php

Untuk melihat metadata Identity Provider (oneid) kita bisa akses url Identity Provider (oneid) kemudian ke menu federation (http://oneid.hanangpriambodo.com/simplesaml/module.php/core/frontpage_federation.php). di dalamnya ada menu SAML 2.0 IdP Metadata, klik show metadata (atau bisa langsung mengakses url : http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/metadata.php?output=xhtml).

pada bagian simple flat text di bawah box format xml ada beberapa informasi yang perlu di perhatikan, seperti : $Metadata, EntityID, SingleSignOnService pada bagian Location, dan SingleLogoutService pada bagian Location juga, serta pada paling bawah terdapat bagian Certificate yang dapat di download pada menu idp.crt.

Kelima hal ini akan di perlukan untuk konfigurasi pada pada file authsources.php dan saml20-idp-remote.php.

Kemudian untuk mendapatkan EntityID Service Provider (Alfatih) dapat juga dilihat dari menu federation (http://alfatih.hanangpriambodo.com/simplesaml/module.php/core/frontpage_federation.php). EntityID yang kami dapat adalah :

Entity ID: http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/metadata.php/default-sp

Pada web Identity Provider (oneid) saya mendapatkan informasi :

$metadata['http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/metadata.php']
entityid' => 'http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/metadata.php'
'SingleSignOnService' => 'http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/SSOService.php',
'SingleLogoutService' => 'http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/SingleLogoutService.php',

Selanjutnya kita konfigurasi pada file authsources.php. Buka tersebut kemudian kita fokus pada bagian isi file berikut ini (‘default-sp’):

// An authentication source which can authenticate against both SAML 2.0
// and Shibboleth 1.3 IdPs.
'default-sp' => [
         'saml:SP',

         // The entity ID of this SP.
         // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
         'entityID' => null,

          // The entity ID of the IdP this SP should contact.
          // Can be NULL/unset, in which case the user will be shown a list of available IdPs.
         'idp' => null,

          // The URL to the discovery service.
          // Can be NULL/unset, in which case a builtin discovery service will be used.
         'discoURL' => null,

          /*
          * The attributes parameter must contain an array of desired attributes by the SP.
          * The attributes can be expressed as an array of names or as an          associative array
          * in the form of 'friendlyName' => 'name'. This feature requires 'name' to be set.
          * The metadata will then be created as follows:
          * <md:RequestedAttribute FriendlyName="friendlyName" Name="name" />
          */
          /*
          'name' => [
                   'en' => 'A service',
                   'no' => 'En tjeneste',
          ],

          'attributes' => [
                   'attrname' => 'urn:oid:x.x.x.x',
          ],
          'attributes.required' => [
                   'urn:oid:x.x.x.x',
          ],
          */

],

Pada bagian EntityID masukan EntityID dari Service Provider itu sendiri dan idp masukan informasi EntityID yang telah kita dapatkan dari metadata Identity Provider. Script akan menjadi serperti di bawah ini :

// An authentication source which can authenticate against both SAML 2.0
// and Shibboleth 1.3 IdPs.
'default-sp' => [
         'saml:SP',

         // The entity ID of this SP.
         // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
         'entityID' => 'http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/metadata.php/default-sp',

          // The entity ID of the IdP this SP should contact.
          // Can be NULL/unset, in which case the user will be shown a list of available IdPs.
         'idp' => 'http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/metadata.php',

          // The URL to the discovery service.
          // Can be NULL/unset, in which case a builtin discovery service will be used.
         'discoURL' => null,

          /*
          * The attributes parameter must contain an array of desired attributes by the SP.
          * The attributes can be expressed as an array of names or as an          associative array
          * in the form of 'friendlyName' => 'name'. This feature requires 'name' to be set.
          * The metadata will then be created as follows:
          * <md:RequestedAttribute FriendlyName="friendlyName" Name="name" />
          */
          /*
          'name' => [
                   'en' => 'A service',
                   'no' => 'En tjeneste',
          ],

          'attributes' => [
                   'attrname' => 'urn:oid:x.x.x.x',
          ],
          'attributes.required' => [
                   'urn:oid:x.x.x.x',
          ],
          */

],

kemudian simpan dan keluar dari file tersebut. Selanjutnya kita konfigurasi file saml20-idp-remote.php pada direktori metadata dengan menambahkan informasi berikut pada bagian paling bawah file :

$metadata['http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/metadata.php'] = [
'SingleSignOnService' => 'http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/SSOService.php',
'SingleLogoutService' => 'http://oneid.hanangpriambodo.com/simplesaml/saml2/idp/SingleLogoutService.php',
'certificate' => 'idp.crt',
];

Penting!!!. jangan lupa untuk menanamkan sertifikat idp.crt yang didowload dari metadata Identity Provider ke dalam direktori cert (co: /data/alfatih/simplesaml/cert/) yang ada di direktori simplesaml Service Provider (Alfatih).

Konfigurasi Identity Provider
Pada web Identity Provider (Oneid) kita fokus pada beberapa hal :

  1. url untuk melihat metadata pada web Service Provider (Alfatih dan Ayyubi)
  2. file metadata/saml20-sp-remote.php

Karena web Alfatih dan Ayyubi sama sama menggunakan aplikasi simplesamlphp, maka untuk melihat metadata kita bisa buka lihat pada menu federation.

  • Alfatih : http://alfatih.hanangpriambodo.com/simplesaml/module.php/core/frontpage_federation.php
  • Ayyubi : http://ayyubi.hanangpriambodo.com/simplesaml/module.php/core/frontpage_federation.php

Yang perlu di perhatikan pada saat melihat metadata Service Provider adalah :

  1. $metadata,
  2. SingleLogoutService, dan
  3. AssertionConsumerService dengan binding HTTP_POST

Pada alfatih kami mendapatkan info :

$metadata['http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/metadata.php/default-sp']
'SingleLogoutService' => 'http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
'AssertionConsumerService' => 'http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',

Pada ayyubi kamu mendapatkan info :

Kemudian informasi tersebut masukan pada baris terakhir kedalam file  metadata/saml20-sp-remote.php yang ada pada direktori simplesaml oneid (/data/oneid/simplesaml/metadata/). dengan format seperti berikut :

$metadata['http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/metadata.php/default-sp'] = [
'SingleLogoutService' => 'http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
'AssertionConsumerService' => 'http://alfatih.hanangpriambodo.com/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
];
$metadata['http://ayyubi.hanangpriambodo.com/simplesaml/module.php/saml/sp/metadata.php/default-sp'] = [
'SingleLogoutService' => 'http://ayyubi.hanangpriambodo.com/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
'AssertionConsumerService' => 'http://ayyubi.hanangpriambodo.com/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
];

Simpan dan keluar.

Selesai sudah instalasi simplesamlphp sebagai IdP (Identity Provider) dan SP (Service Provider) sebagai autentikasi ala ala google single sign on. untuk ujicoba, kita lakukan beberapa kasus :

  1. login dari oneid (IdP), kemudian check di site alfatih dan ayyubi (SP),  kemuidan logout dari salah satu site SP. Kemudian Refresh semua site (Idp dan SP).
    1. Login dari oneid (IdP)
      • akses : http://oneid.hanangpriambodo.com/simplesaml/module.php/core/frontpage_auth.php
      • kemudian pilih Test configured authentication sources
      • kemudian pilih example-userpass
      • Akan tampil form login. masukan user employee dengan pass employeepass
      • Jika berhasil login, akan tampil informasi atribut dari employee
      •  
    2. Masuk ke site autentikasi alfatih atau ayyubi (SP)
    3. Kemudian untuk logout dari SP. pada site Alfatih atau ayyubi saat dapat melihat atribut user (employee) pada bagian kiri bawah ada link logout.
    4. Klik link tersebut. kemudian refresh semua site. bila kembali kehalaman login atau tidak menampilkan attribut, maka single sign on berhasil.
  2. Ujicoba login dari salah satu site SP. kemudian lihat semua site pada halaman autentikasi. Apabila memberikan informasi atribut maka login berhasil. kemudian uji coba logout dari halaman IdP.

Jika uji coba telah berasil dilakukan, maka system sudah berjalan dengan semestinya.

 

 

Leave a Reply