
مقدمه :
SimpleSAMLphp یک برنامه احراز اصالت PHP به صورت منبع باز (Open Source) است که از SAML 2.0 به عنوان ارائه دهنده خدمات (SP) یا ارائه دهنده هویت (IdP) پشتیبانی می کند.
SAML(زبان علامت گذاری احراز اصالت) یک مکانسیم ارتباطی امن بر مبنای XML است که برای احراز هویت و تایید داده های تبادلی بین سازمانی بکار میرود. که معمولا برای پیاده سازی احراز اصالت یکئارچه Single Sign On (SSO) استفاده میشود.این کار نیاز به تایید هویت چندگانه در سازمان های مختلف را از بین میبرد.به عبارتی ساده تر ،شما میتوانید از یک هویت (شناسه) مانند نام کاربری و رمز عبور برای چندین برنامه مختلف استفاده کنید.
به عنوان مثال: یک SAML به یک منبع تایید هویت مانند LDAP یا بانک اطلاعاتی کاربران که ارائه دهنده احراز هویت است متصل میشود و قبل از دسترسی کاربران به منابعی که توسط ارائه دهندگان خدمات فراهم شده دوباره کاربران را تعیین هویت میکند.
در این آموزش Simple SAML PHP را نصب کرده و برای استفاده از پایگاه داده MySQL به عنوان منبع تأیید اعتبار، آن را پیکربندی میکنیم. شما کاربران و رمزهای عبور آنها را که بصورت رمزگذاری شده هستند را در پایگاه داده ذخیره میکنید و بررسی میکنید که چطور میتوانید از آن اطلاعات برای ورود به سیستم استفاده کنید.
پیش نیازها:
- یک سرور Ubuntu 18.04
- پکیج LAMP روی سرور (Apache, Mysql, PHP)
- یک نیم سرور (Name Server) که به IP سرور شما اشاره میکند
- تنظیم Virtual Hosts در Apache برای سرو دامنه
- نصب SSL روی دامنه
مرحله 1 – دانلود و نصب SimpleSAMLphp
نصب SimpleSAMLphp شامل چند مرحله است. ما باید خود نرم افزار و همچنین اجزاء و پیش نیاز اضافی را نصب کنیم و همچنین نیازمند تغییراتی در پیکربندی وب سرور خود هستیم.
اگر تا اکنون وارد سرور نشده اید به سرور وارد شوید.
SimpleSAMLphp را از وب سایت پروژه بارگیری کنید. SimpleSAMLphp همیشه آخرین نسخه نرم افزار خود را به یک URL پیوند می دهد. میتوانیم با دستور زیر ، آخرین نسخه را دریافت کنیم:
wget https://simplesamlphp.org/download?latest
یک فایل فشرده بارگیری میشود که با استفاده از دستور tar
میتوانید آنرا از حالت فشرده خارج کنید:
tar zxf download?latest
فایل ها به یک دایرکتوری جدید به نام simplesamlphp-1.x.y استخراج می شوند ، که x.y شماره نسخه جاری است. برای شناسایی فایل از دستور ls
استفاده کنید:
ls
با استفاده از دستور cp
، محتویات فهرست را در مسیر /var/simplesamlphp
کپی کنید. حتما شماره نسخه ای که دارید را با نسخه موجود جایگزین کنید:
sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/
سوئیچ -a
اطمینان حاصل میکند که مجوزهای فایل به همراه فایل ها و پوشه ها کپی میشوند. علامت نقطه در پایان مسیر منبع تضمین این است که همه چیز از جمله فایلهای مخفی در مسیر مقصد کپی میشود.
حالا به تعدادی از اکستنشنهای PHP نیاز دارید. در ادامه دستورات زیر راوارد کنید. ابتدا:
sudo apt update
حالا پکیجهای مورد نیاز را نصب میکنیم:
sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached
پس از نصب ، Apache را مجدداً راه اندازی کنید تا پکیجهای جدید PHP فعال شوند:
sudo systemctl restart apache2
اکنون که SimpleSAMLphp نصب شده است، Apache را برای پیکربندی میکنیم.
مرحله 2 – پیکربندی Apache برای بکاربردن SimpleSAMLphp
قبلا یک دامین را روی سرور تنظیم کردهاید و SSL رو آن فعال کرده اید. حالا مراحل زیر را دنبال کنید:
فایلهای عمومی SimpleSAMLphp در دایرکتوری /var/simplesamlphp/www
قرار دارند. تنظیمات وب سرور را به شکلی انجام دهید که دامنه مورد نظر شما به این مسیر اشاره کند.
برای این کار دستورات زیر را وارد کنید:
sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
Alias /simplesaml /var/simplesamlphp/www
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
بعد از ذخیره و بستن فایل وب سرور را Restart میکنیم.
sudo systemctl restart apache2
Apache برای میزبانی از برنامه پیکربندی شده است ، حالا باید SimpleSAMLphp را پیکربندی کنیم.
مرحله 3 – پیکربندی SimpleSAMLphp
برای شروع کار را با ویرایش فایل تنظیمات آغاز میکنیم:
nano /var/simplesamlphp/config/config.php
پسورد سرور را با پیدا کردن خط ‘auth.adminpassword’ و جایگزین کردن مقدار پیشفرض 123 با یک پسورد ایمن تر تنظیم کنید.این رمزعبور به شما اجازه میدهد به برخی از صفحات SimpleSAMLphp خود دسترسی پیدا کنید:
. . .
'auth.adminpassword' => 'your_admin_password',
. . .
حالا به نمک کار میرسیم! Salt یک رشته تصادفی برای هش کردن پسوردها و دادههای حساس است. توصیه میکنیم حتما Salt را عوض کنید:
برای تولید رشته تصادفی می توانید از تابع رند OpenSSL استفاده کنید و از آن به عنوان رشته Salt مخفی استفاده کنید. یک ترمینال جدید باز کنید ، دوباره به سرور خود متصل شوید و برای تولید این رشته دستور زیر را اجرا کنید:
openssl rand -base64 32
گزینه -base64 32
یک رشته رمزگذاری شده Base64 را به طول 32 کاراکتر ایجاد میکند.
سپس در پرونده پیکربندی ، 'secretsalt'
را پیدا کرده و پیش فرض را با رشته ای که تولید کرده اید جایگزین کنید:
. . .
'secretsalt' => 'your_generated_salt',
. . .
سپس اطلاعات تماس فنی را تنظیم کنید. SimpleSAMLphp گزارش خطای ایجاد شده را به آدرس ایمیلی که مشخص کرده اید ارسال می کند. بخش زیر را پیدا کنید:
. . .
'technicalcontact_name' => 'Administrator',
'technicalcontact_email' => 'na@example.org',
. . .
سپس منطقه زمانی را که می خواهید استفاده کنید تنظیم کنید. این بخش را پیدا کنید:
. . .
'timezone' => 'Asia/Tehran',
. . .
فایل را ذخیره کرده و ببندید. می توانید با مراجعه به https://your_domain/simplesaml به سایت موجود در مرورگر خود دسترسی پیدا کنید. صفحه زیر را در مرورگر خود مشاهده خواهید کرد:

برای اطمینان از اینکه نصب PHP شما مطابق با شرایط مورد نیاز SimpleSAMLphp باشد ، Configuration را انتخاب کرده و روی لینک ورود به عنوان مدیر کلیک کنید. سپس از رمز عبوری که در فایل تنظیمات در مرحله 3 تنظیم کرده اید استفاده کنید.
پس از ورود به سیستم ، لیستی از پکیجهای مورد نیاز و توصیه شده PHP را که توسط SimpleSAMLphp استفاده شده است ، مشاهده خواهید کرد. بررسی کنید که همه افزونهها را به جز predis / predis نصب کرده اید:

اگر مواردی دیگری درست نصب نشدهاند آموزش را مجددا مرور کنید و مطمئن شوید همه مراحل را درست انجام دادهاید.
همچنین لینکی با عنوان Sanity check of your SimpleSAMLphp setup وجود دارد. روی لینک کلیک کنید تا سیستم بررسی کند بقیه موارد درست نصب شدهاند یا خیر.
حالا نوبت به پیکربندی میرسد.
مرحله 4 – پیکربندی احراز اصالت
حالا که SimpleSAMLphp را نصب و راه اندازی کردیم، برای احراز اصالت کاربران باید یک منبع را پیکره بندی کنیم. ما از یک پایگاه داده MySQL برای ذخیره نام کاربری و رمز عبور کاربران استفاده خواهیم کرد.
برای شروع به عنوان کاربر روت وارد Mysql میشویم:
mysql -u root -p
با وارد کردن رمز عبور وارد سیستم خواهید شد.
بعد ، یک دیتابیس ایجاد کنید که به عنوان منبع تأیید اعتبار عمل کند که auth خوانده میشود . میدانید که حتما لازم نیست از این نامها استفاده کنید.
CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
یک کاربر MySQL ایجاد کنید که منحصرا برای پایگاه داده باشد، از دیدگاه مدیریت و امنیت ، ایجاد پایگاه داده ها و حساب های یک منظوره مناسبتر است. ما نام کاربر را authuser میگذاریم. دستور زیر را برای ایجاد کاربر ، تنظیم گذرواژه و دسترسی به پایگاه داده auth اجرا کنید. یک رمزعبور قوی را برای کاربر جدید پایگاه داده خود انتخاب کنید.
GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';
یک جدول برای کاربر ایجاد کنید که دو قسمت است : نام کاربری و رمز عبور. برای امنیت بیشتر ، ما می خواهیم از تابع MySQL AES_ENCRYPT()
،رمزگذاری رشته ای رمز عبور استفاده کنیم ، در نتیجه رمزهای عبور را به صورت متن ساده ذخیره نمی کنیم. این تایع یک رشته را رمزگذاری می کند و یک رشته باینری را برمی گرداند.
CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));
سپس سه کاربر را در جدول تازه ایجاد شده وارد کنیم. در اینجا ما از تابع () AES_ENCRYPT برای رمزگذاری مقادیر مربوط به قسمت رمز عبور استفاده میکنیم. شما باید رشته ای تولید کنید که از آن به عنوان کلید رمزنگاری استفاده شود. این مورد را با یک رمز عبور جایگزین کنید.
INSERT INTO auth.users(username, password) VALUES
('user1', AES_ENCRYPT('user1pass','your_secret_key')),
('user2', AES_ENCRYPT('user2pass','your_secret_key')),
('user3', AES_ENCRYPT('user3pass','your_secret_key'));
برای هر کاربر از همان کلید استفاده کنید و حتما این کلید را به یاد داشته باشید تا بتوانید دوباره از آن استفاده کنید و بعدا کاربران دیگری ایجاد کنید. از این کلید مخفی نیز در پیکربندی SimpleSAMLphp استفاده خواهید کرد تا بتوانید رمزهای عبور را رمزگشایی کرده و آنها را با مواردی که کاربران وارد می کنند مقایسه کنید.
حالا باید جدول دسترسیها را در Mysql با دستور زیر آپدیت کنیم:
FLUSH PRIVILEGES;
از Mysql خارج شوید:
exit
برای فعال کردن عملکرد ارائه دهنده هویت در SimpleSAMLphp،ما نیاز داریم تا فایل /var/simplesamlphp/config/config.php
را ویرایش کنیم.
nano /var/simplesamlphp/config/config.php
این بخش از پرونده را پیدا کرده و false
را با true
جایگزین کنید.
...
'enable.saml20-idp' => true,
...
فایل را ذخیره کنید و از ویرایشگر خارج شوید.
اکنون که قابلیت ارائه دهنده احراز هویت را فعال کرده ایم ، نیاز داریم ماژول تأیید اعتبار را مشخص کنیم. از آنجا که ما یک جدول کاربر در یک پایگاه داده MySQL داریم ، ما قصد داریم از ماژول تأیید هویت SQL استفاده کنیم. فایل پیکربندی authsource را باز کنید:
nano /var/simplesamlphp/config/authsources.php
قطعه زیر را که کامنت شده پیدا کنید:
...
/*
'example-sql' => array(
'sqlauth:SQL',
'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
'username' => 'simplesaml',
'password' => 'secretpassword',
'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
),
*/
...
این کد اتصال به یک پایگاه داده و کوئری را تعیین میکند. SimpleSAMLphp می تواند از آن برای جستجوی کاربر در یک جدول پایگاه داده که جدول کاربران نام دارد استفاده کند. باید با استفاده از عملکرد MySQL AES_DECRYPT()
به جستجوی کاربر از جدول خود بپردازیم و کوئری را تغییر دهیم.
ما باید همان کلید را که برای رمزگذاری رمزهای عبور در کوئری استفاده کردیم که با تایعAES_DECRYPT()
ارئه دادیم باید از همان رمز عبور برای تایید اعتبار کاربر استفاده کنیم.
فایل را به این شکل تغییر میدهیم
...
'example-sql' => array(
'sqlauth:SQL',
'dsn' => 'mysql:host=localhost;port=5432;dbname=auth',
'username' => 'authuser',
'password' => 'your_mysql_auth_user_password',
'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password',
),
...
حتماً کلید مخفی که مشخص کرده اید به جای your_secret_key خود قرار دهید. فایل را ذخیره کنید و ببندید. حالا نوبت به تست میرسد.
مرحله 5 – تست احراز هویت با SAML 2.0 SP
میتوانید با ورود به قسمت Authentication و کلیک روی لینک Test configured authentication sources احراز هویت را تست کنید.

example-sql را کلیک کنید ،این ارائه دهنده ای است که در مرحله قبل پیکره بندی کردید، یک نام کاربری و رمز عبور وارد کنید، میتوانید یکی از نام کاربری و رمز عبورهایی که برای سه کاربر در جدول کاربران MySQL ایجاد کردید را وارد کنید،سعی کنید نام کاربری کاربر 1 را به همراه رمز عبور کاربر 1 را وارد کنید.
در صورت درست وارد کردن صفحه زیر را خواهید دید:

اکنون میتوانید با استفاده از مستندات و API ها SimpleSAMLphp را با اپلیکیشن خود SimpleSAMLphp ادغام کنید. میتوانید از مستندات API های SimpleSAMLphp استفاده کنید.
Leave a Comment