Indonesian Security Conference 2010 - OAuth Untuk Pengamanan Credentials Pada Akses REST API -...
-
Upload
panggi-libersa-jasri-akadol -
Category
Documents
-
view
630 -
download
4
description
Transcript of Indonesian Security Conference 2010 - OAuth Untuk Pengamanan Credentials Pada Akses REST API -...
1
OAuth untuk pengamanan credentials pada akses REST API
Panggi Libersa Jasri Akadol , S.Kom
Open Security Lab ( http://www.opensecuritylab.org ) Bandung , Indonesia [email protected]
Abstrak
OAuth adalah delegated authorization protocol . Dengan menggunakan protokol ini ,
seorang user dapat memberikan kuasa pada client untuk mengakses data terproteksinya
yang berada di server tanpa harus menyerahkan username dan password . Autentikasi
OAuth dikatakan three-legged karena ada tiga partisipan , yaitu : Service provider ,
OAuth consumer dan User.
1. Pendahuluan
Mulai dari awal web platform diciptakan , hingga saat ini banyak terjadi perubahan . Dari
yang awalnya hanya berupa teks dan tautan html statis , berkembang menjadi konten
dinamis yang didukung oleh teknologi yang sifatnya juga berkembang seperti web
services. Web service menyediakan standar komunikasi di antara berbagai aplikasi
software yang berbeda-beda. Ia dapat berjalan di berbagai platform maupun
framework. Dengan adanya web service kita dapat mengkomunikasikan berbagai
software dari berbagai software dari berbagai mesin maupun platform yang berbeda.
Perkembangan web service pun terjadi secara signifikan dan telah diciptakan beberapa
arsitektur untuk keperluan tersebut. Salah satunya yang dibahas di sini adalah arsitektur
REST.
Dengan REST komunikasi yang terjadi bisa menjadi mudah antara penyedia dan peminta
sumber daya. Namun , sumber daya ada yang terbuka sebagian dan ada yang
terproteksi sehingga untuk melakukan akses ke sumber daya ( resources ) diperlukan
autentikasi untuk mengenali peminta akses. Pada umumnya variabel autentikasi (
credentials ) yang digunakan adalah username dan password .
2
Seiring dengan era keterbukaan di dunia maya , dimungkinkan antar aplikasi web untuk
saling berkomunikasi untuk meminta resources satu sama lain sehingga diperlukan
autentikasi untuk mengaksesnya. Contohnya adalah fasilitas dari aplikasi yang ingin
menggunakan akses ke twitter untuk memperoleh hasil seperti unggah gambar pada
http://twitpic.com . Untuk menjalankan aplikasi tersebut syarat utamanya ( sebelum
Basic Auth di hapus dari sistem twitter ) adalah menggunakan username dan password.
Bayangkan jika penyedia aplikasi itu menyimpan credentials kita tadi , dia bisa
melakukan take over account dan kita tidak bisa mendapatkan akun kita kembali karena
penyedia aplikasi telah memiliki kemampuan penuh terhadap resource yang ada.
Untuk itulah diciptakan OAuth , yang menggunakan token sebagai alat ganti username
dan password dan aksesnya pun bisa dibatasi atau bahkan aksesnya bisa di hapus
kapanpun kita mau tanpa ada rasa kawatir akun kita akan diambil oleh orang. Saat ini
telah banyak yang mengadopsi OAuth , antara lain Google , Yahoo! , twitter , facebook
dan banyak aplikasi web lainnya termasuk wepay.com yang bergerak di bidang online
payment.
2. Cara kerja OAuth secara umum
OAuth bergantung pada tiga set dari token dan secret yang didapat dari server dan
client:
1. Consumer key dan consumer secret
Consumer key adalah unique identifier untuk client yang digunakan client untuk
melakukan request untuk mendapatkan request tokens.
a. Contoh consumer key : T1NuLdkR9ACB4GBEOc1Qvw
b. Contoh consumer secret : RGwVY9zru6evNMez3iI4qLke9UYaW5RCgdx8kfyKKh
2. Request token dan Request token secret
Request token adalah temporary one-time identifier yang diberikan oleh server
untuk tujuan permintaan kepada user untuk melakukan grant permission pada
3
client. Token secret digunakan untuk melakukan sign request untuk mendapatkan
sebuah access token.
3. Access token dan Access token secret
Access token adalah identifier untuk digunakan oleh client untuk melakukan akses ke
resources milik user. Sebuah client bisa melakukan akses ke resources milik user
selama token nya masih valid. Server bisa melakukan revoke kapanpun karena sudah
expire atau user melakukan revoke secara manual. Secret digunakan untuk sign
request ke resources yang di proteksi oleh akses user.
a. Contoh Access token :
45014365-GUPXF66BQ0t3nLFpT7rkLFPuXBGn4XbH5WyjCwXlu
b. Contoh Access token secret :
xQNMgYntxxj505w50XDHS0m0MU3NrquDOE2VUjUk
Menggunakan OAuth dapat melalui tahap-tahap berikut . Tujuan dari langkah-langkah
berikut adalah untuk mendapatkan access token dan secret. Server bisa mengizinkan
access token untuk jangka waktu tertentu dan / atau membatasi akses ke resources
tertentu milik user saja.
1. Client melakukan request ke server menggunakan sebuah consumer key
2. Client menggunakan consumer key untuk mendapatkan sebuah request token dan
secret.
3. Client melakukan redirect pada user ke server untuk grant permission untuk client
melakukan akses ke resources milik user. Proses ini bisa terjadi jika request token
telah diautentikasi.
4. Client melakukan request ke server untuk memberikan access token dan secret .
Ianya merepresentasikan sebuah identifier dan shared secret yang client nya bisa
gunakan untuk mengakses resources atas nama user.
5. Ketika membuat sebuah request untuk akses ke resource terproteksi , client
menyertakan Authorization header yang berisi consumer key, access token ,
signature method dan sebuah signature , timestamp , sebuah nonce , dan untuk
opsionalnya adalah versi dari OAuth yang digunakan.
4
Gambar 1. OAuth Flow
3. Contoh cara kerja OAuth secara detail
Diasumsikan server membuatkan a1191fd420e0164c2f9aeac32ed35d23 sebagai sebuah
consumer key dan fd9b9d0f769c3bcc548496e4b5077da79c02d7be sebagai consumer
secret. Disisi client , untuk berhubungan dengan server oauth , ianya harus melakukan
akses ke URI berikut ( menggunakan SSL atau TLS untuk komunikasi ) :
1. Sebuah URI untuk mendapatkan request tokens , contoh :
https://api.twitter.com/oauth/request_token
2. Sebuah URI untuk mendapatkan autorisasi user , contoh :
https://api.twitter.com/oauth/authorize
3. Sebuah URI untuk mendapatkan sebuah access token , contoh :
https://api.twitter.com/oauth/access_token
Parameter yang diperlukan saat melakukan request :
1. oauth_consumer_key : merupakan unique identifier yang dibuatkan oleh server
untuk setiap client.
2. oauth_signature_method : ini adalah metode untuk melakukan sign ketika
melakukan komputasi sebuah signature. OAuth menggunakan HMAC-SHA1 dan RSA-
SHA1 sebagai metode untuk sign. Ketika client dan server menggunakan TLS ,
dimungkinkan untuk menggunakan metode PLAINTEXT yaitu text biasa tanpa
enkripsi , namun ada baiknya menggunakan antara HMAC-SHA1 atau RSA-SHA1.
5
3. oauth_timestamp : ini adalah jumlah detik sejak tanggal 1 Januari 1970 , 00:00:00
GMT
4. oauth_nonce : ini adalah string acak yang unique untuk semua requests yang
dikirimkan sesuai dengan oauth_timestamp . Parameter ini membantu server
mengatasi serangan replay . Tidak seperti pada digest authentication , OAuth
membutuhkan clients untuk membangkitkan nilai nonce.
5. oauth_version : ini adalah versi dari OAuth , yang saat ini versi stabilnya adalah 1.0
Langkah pertama yang dilakukan oleh client adalah melakukan submit sebuah request
untuk mendapatkan sebuah request token dan secret dari server. Signature pada request
ini berdasarkan pada consumer secret yang client dapatkan bersama consumer key.
Signature menyertakan oauth_consumer_key , oauth_signature_method,
oauth_timestamp , oauth_nonce , dan oauth_version dan harus di komputasi seperti
berikut :
1. Didapatkan parameter oauth_consumer_key , oauth_signature_method,
oauth_timestamp, oauth_nonce, dan oauth_version.
2. Percent-encode parameter-parametaenya dan urutkan dulu sesuai nama lalu
sesuai nilainya.
3. Konkatenasi parameter menjadi sebuah string seperti disaat melakukan komputasi
sebuah aplikasi / x-www-form-urlencoded string . Pada contoh kali ini , nilai dari
string adalah
oauth_consumer_key=a1191fd420e0164c2f9aeac32ed35d23&oauth_nonce=1098
43dea839120a&oauth_signature_method=HMAC-SHA1&oauth_timestamp=
1258308730&oauth_version=1.0.
4. Komputasi sebuah signature menggunakan shared secret . Untuk contoh disini
adalah d8e19bb988110380a72f6ca33b2ba5903272fe1.
5. Lakukan base64-encode pada signature , dan setelah itu lakukan percent-encode
dari text.
6
Menggunakan signature ini , consumer mengirimkan sebuah request untuk
mendapatkan sebuah request token.
# Request untuk mendapatkan request token
POST /request_token HTTP/1.1 [1]
Host: api.twitter.com
Authorization: OAuth realm="http://api.panggi.net/photos",
oauth_consumer_key=a1191fd420e0164c2f9aeac32ed35d23,
oauth_nonce=109843dea839120a,
oauth_signature=d8e19bb988110380a72f6ca33b2ba5903272fe1,
oauth_signature_method=HMAC-SHA1,
oauth_timestamp=1258308730,
oauth_version=1.0 [2]
Content-Length: 0
# Response berisi sebuah request token dan secret
HTTP/1.1 200 OK
Content-Type: application/x-www-form-urlencoded
oauth_token=0e713d524f290676de8aff4073b1bb52e37f065c
&oauth_token_secret=394bc633d4c93f79aa0539fd554937760f05987c [3]
Keterangan :
[1] Request untuk mendapatkan sebuah request token dan secret
[2] Authorization header untuk mengautentikasi client
[3] Response berisi sebuah request token dan sebuah secret
oauth_token di response adalah sebuah request_token yang client harus gunakan untuk
mendapatkan izin dari user. Client lalu melakukan redirect pada user untuk mengunjungi
resource pada server untuk grant authorization.
# Request untuk mendapatkan authorization
GET /oauth/authorize?oauth_token=0e713d524f290676de8aff4073b1bb52e37f065c
HTTP/1.1
Host: api.twitter.com
7
Implementasi dari resource tergantung pada server . Pada titik ini , server akan
melakukan pengecekan apakah user telah terautentikasi dengan server. Server bisa
mengizinkan user untuk memilih bagian dari data yang daoat client akses dan sifat dari
akses tersebut. Contohnya, user bisa memberikan izin ke client untuk melakukan edit
data atau membuat data baru tetapi tidak mengizinkan penghapusan data. Jika client
memiliki antarmuka berbasis web , server bisa meredirect user ke antarmuka client
melalui callback URI . Jika tidak , server akan meminta user memasukkan kode verifikasi
pada antarmuka pengguna.
Client menggunakan kode verifikasi untuk mendapatkan sebuah access token . Signature
pada request adalah didasarkan pada oauth_consumer_key , request_token , kode
verifikasi , oauth_signature_method , oauth_timestamp , oauth_nonce , dan
oauth_version.
# Request untuk mendapatkan an access token
POST /access_token HTTP/1.1 [1]
Host: api.panggi.net
Authorization: OAuth
oauth_consumer_key="a1191fd420e0164c2f9aeac32ed35d23",
oauth_token="ad0d1c7a765c9e6e8b14e639c763177312d18e7e",
oauth_verifier="988786765423",
oauth_signature_method="RSA-SHA1",
oauth_signature="698d58fd3316304181e11c6eb8127ffea7e2df46",
oauth_timestamp="1258328458",
oauth_nonce="109843dea839120a",
oauth_version="1.0" [2]
Content-Length: 0
HTTP/1.1 200 OK
Content-Type: application/x-www-form-urlencoded
oauth_token=8d743f1165c7030177040ec70f16df8bc6f415c7
&oauth_token_secret=95aec3132c167ec2df818770dfbdbd0a8b2e105e [3]
8
Keterangan :
[1] Request untuk mendapatkan sebuah access token dan secret
[2] Authorization header untuk mengautentikasi client
[3] Response berisi sebuah access token dan token secret
Response ini berisi sebuah access token dan sebuah secret . Server harus melakukan
verifikasi bahwa request token cocok dengan consumer key sebelum memberikan access
token. Client menggunakan nilai-nilai tersebut untuk membuat sebuat Authorization
header dengan requestnya untuk mengakses protected resources dari user tersebut.
Signature di request ini berdasarkan pada oauth_consumer_key , access token ,
oauth_signature_method , oauth_timestamp , oauth_nonce , dan oauth_version dengan
parameter query di URI pada body dari request ketika request media type adalah
application/x-www-form-urlencoded
# Request
POST /albums/2009/08/1011/duplicate;t=a5d0e32ddff373df1b3351e53fc6ffb1
HTTP/1.1
Host: api.twitter.com [1]
Authorization: OAuth
oauth_consumer_key="a1191fd420e0164c2f9aeac32ed35d23",
oauth_token="827fa00c6f15db4063378bb988e1563e0c318dbc",
oauth_signature_method="RSA-SHA1",
oauth_signature="f863cceebb4f1fe60739b125128e7355dcbf14ea",
oauth_timestamp="1258328889",
oauth_nonce="3c93e7fdd1101e515997abf84116ef579dccce1a",
oauth_version="1.0" [2]
Keterangan :
[1] Request untuk mengakses sebuah protected resource
[2] Request berisi sebuah Authorization header menggunakan access token dan token
secret .
9
4. REST
Representational State Transfer atau REST secara umum berarti bahwa setiap unique
URL adalah representasi dari objek. Konten dari objek tersebut bisa didapatkan dengan
melakukan HTTP request berupa GET , dan untuk melakukan modifikasi pada objek bisa
digunakan metode POST , PUT , atau DELETE.
Gambar 2. Struktur Desain REST
5. Contoh Penerapan pada Twitter
5.1 API Twitter
API adalah singkatan dari Application Programming Interface yang jika dijelaskan secara
singkat merupakan sesuatu yang seperti antarmuka pengguna , tetapi content yang
diberikan dirancang agar mudah bagi perangkat keras untuk membaca dan
menggunakannya ( parsing dan processing ).
API tidak hanya membuat kemudahan dalam melakukan pembacaan dan penggunaan ,
tetapi juga untuk akses secara remote . Dengan API twitter , hanya dengan melakukan
request URL sederhana dengan sedikit parameter HTTP POST , dimungkinkan untuk
melakukan status update dan direct message.
10
Gambar 3. Contoh REST API pada twitter
API twitter didesain menggunakan arsitektur REST ( Representational State Transfer )
yang bila diartikan secara sederhana adalah API yang menggunakan HTTP request
seperti GET , PUT , POST dan DELETE untuk berkomunikasi dan request data ke server
secara straightforward seperti mengakses halaman web.
5.2 Jenis API Twitter
Ada empat jenis API yang bisa digunakan di twitter antara lain :
1. API General yang berisi tentang fungsionalitas umum dari twitter
2. API Search yang berisi tentang fungsionalitas pencarian
3. API Streaming yang berisi akses near-realtime ke public timeline
4. API @Anywhere yang berisi akses ke penggunaan twitter platform yang
diintegrasikan ke situs.
5.3 HTTP Request , HTTP Response Status Code dan Kesalahan
Selain HTTP request yang berupa GET , POST , DELETE dan PUT , ada pula yang dinamakan
HTTP response yaitu balasan dari server sebagai respon dari permintaan.
11
1. HTTP Request
Secara default HTTP request itu memiliki banyak parameter antara lain HEAD , GET ,
POST , PUT , DELETE , TRACE , OPTIONS , CONNECT dan PATCH . Namun API twitter
mendukung hanya GET , POST , DELETE dan PUT. Berikut penjelasannya :
1. GET : meminta sebuah representasi dari resource yang dispesifikasikan
2. POST : melakukan submit data untuk diproses ke resource yang diidentifikasikan
3. DELETE : melakukan penghapusan ke resource yang diidentifikasikan
4. PUT : melakukan unggah sebuah representasi dari resource yang dispesifikasikan
2. HTTP Response
1 . 200 OK : segalanya berhasil
2 . 304 Not Modified : tidak ada perubahan semenjak permintaan terakhir
3 . 400 Bad Request : ada kesalahan di permintaan
4 . 401 Not Authorized : tidak memiliki akses
5 . 403 Forbidden : update telah melewati limit yang telah ditetapkan
6 . 404 Not Found : resource yang diinginkan tidak ditemukan
7 . 406 Not Acceptable : API search memberikan Status ini jika melakukan request
dengan format yang tidak valid atau tidak didukung
8 . 420 Rate Limited : Rate limit telah terlewati
9 . 500 Internal Server Error : ada kesalahan di server twitter
10 . 502 Bad Gateway : Twitter sedang down untuk maintainance
11 . 503 Service Unavailable : Twitter sedang overloaded sehingga permintaan tidak bisa
diproses
12
a. Mendaftarkan Aplikasi di twitter
Untuk memulai menggunakan API twitter , diharuskan untuk mendaftarkan terlebih
dahulu dengan langkah sebagai berikut :
1. Melakukan akses ke http://dev.twitter.com/apps/new
2. Mengisi hal-hal yang diperlukan yaitu :
a. Application name : nama aplikasi
b. Description : deskripsi aplikasi
c. Application Website : alamat website dari aplikasi
d. Organization : organisasi pemilik aplikasi
e. Application type : tipe aplikasi yaitu Client atau Browser
f. Callback URL : alamat URL untuk di redirect setelah akses disetujui
g. Default Access Type : berupa “Read & Write” atau “Read Only”
h. Application Icon : Icon untuk aplikasi
i. Captcha : form yang harus diisi untuk memastikan bahwa yang membuat adalah
manusia
3. Setelah pembuatan/pendaftara aplikasi selesai maka akan diberikan Consumer key ,
Consumer secret , API key , Access Token dan Access Token Secret yang akan
dijelaskan di bagian analisis OAuth.
5.5 Cara Kerja OAuth di Twitter
Ketika pengunjung datang ke halaman login , aplikasi mengirimkan request GET ke
server twitter melalui sebuah set kode request. Kode request ini digunakan untuk
verifikasi user pada website twitter.
User lalu di dibawa ke halaman twitter untuk melakukan allow atau deny untuk akses
aplikasi. Jika user melakukan allow pada aplikasi , maka user akan dibawa kembali ke
alamat aplikasi. URL tempat user akan dipindahkan telah berisi token OAuth yang akan
13
digunakan di langkah selanjutnya. Urutan cara kerja OAuth pada twitter adalah sebagai
berikut:
1. User melakukan akses pada aplikasi , aplikasi menghubungi twitter untuk
mendapatkan one-time Request Token.
Gambar 4. Cara kerja OAuth-01
2. Twitter membalas dengan Request Token dan Request Token Secret Key. Request
Token digunakan untuk membuat authorization link, dan Request Token Secret
digunakan untuk memberitahu twitter bahwa user adalah yang asli melakukan
request untuk Request Token.
Gambar 5. Cara Kerja OAuth-02
3. User melakukan klik pada authorization link yang baru dibangkitkan, dibuat dengan
Request Token. Link melakukan redirect ke Twitter, dan API call melakukan pass
Request Token Secret.
14
Gambar 6. Cara Kerja OAuth-03
4. Twitter memberi prompt kepada user untuk melakukan allow untuk akses aplikasi.
Jika user melakukan konfirmasi , Twitter mengirimkan user kembali ke alamat
aplikasi dengan Access Token dan Access Token Secret key . Token key/pair adalah
unique untuk setiap user dan tidak berubah. Token key/pair ini bisa disimpan di
database untuk keperluan mendatang.
Gambar 7. Cara Kerja OAuth-04
DAFTAR PUSTAKA
[1] Allamaraju Subbu, RESTful Web Services Cookbook, O’Reilly YAHOO! PRESS, 223 – 228, 2010. [2] R.T.Fielding, Architectural Styles and the Design of Network-based Software Architectures, UNIVERSITY OF CALIFORNIA, 76-85, 2000. [3] E. Hammer-Lahav, The OAuth 1.0 Protocol, Internet Engineering Task Force (IETF), 2010.
15
[4] W. Abraham, The first PHP Library to support OAuth for Twitter's REST API, 2010. http://github.com/abraham/twitteroauth , 20 Maret 2010, 04.30 WIB. [5] JSON Team, Pengenalan JSON, 2010. http://json.org/json-id.html , 26 Maret 2010, 16.32 WIB.