فصل ۴: احراز هویت و دسترسی
تفاوت AuthN و AuthZ، امنیت رمز عبور، MFA، SSO با SAML/OAuth/OIDC، ساختار و امنیت JWT، مدیریت نشست، احراز زیستی و معماری Zero Trust.
احراز هویت در برابر اجازهٔ دسترسی
دو مفهوم اغلب اشتباه گرفته میشوند:
- احراز هویت (Authentication / AuthN): پاسخ به سوال «شما کی هستید؟» با اثبات هویت (مثلاً رمز عبور).
- اجازهٔ دسترسی (Authorization / AuthZ): پاسخ به سوال «به چه چیزهایی دسترسی دارید؟» با تعیین سطح دسترسی.
یک مثال ساده: کارت بانکی شما احراز هویت است (این کارت شماست)، اما محدودیت برداشت روزانه ۵ میلیون تومان، اجازهٔ دسترسی است.
همچنین AAA
AuthN و AuthZ با Accounting سهگانهٔ AAA را میسازند. Accounting یعنی ثبت هر کاری که کاربر انجام میدهد برای حسابرسی و صورتحساب.
امنیت رمز عبور
چرا رمزهای سنتی ضعیفاند
طبق گزارشهای سالانه، بیش از ۸۰ درصد نفوذها به سرقت یا حدس رمز عبور برمیگردد. رمزهای کوتاه، قابلپیشبینی یا استفادهمجدد در چند سرویس، بزرگترین ضعفاند.
راهنمای NIST SP 800-63B
مؤسسهٔ استاندارد و فناوری آمریکا (NIST) در نسخهٔ ۳ راهنمای ۸۰۰-۶۳B این توصیهها را ارائه داده:
- حداقل طول ۸ کاراکتر؛ تشویق به عبارات عبور طولانی.
- حذف الزام پیچیدگی سنتی (یک حرف بزرگ، یک عدد و...) چون کاربران را به الگوهای حدسپذیر میکشاند.
- بررسی رمز در برابر لیست رمزهای لو رفته (HaveIBeenPwned API).
- غیرفعالسازی انقضای اجباری رمز مگر در صورت نشت.
- محدودیت نرخ تلاش برای جلوگیری از brute-force.
مدیریتگرهای رمز عبور
بهجای بهخاطر سپردن دهها رمز پیچیده، از یک مدیریتگر رمز عبور استفاده کنید:
- Bitwarden: متنباز، خودمیزبان
- 1Password: حرفهای، پشتیبانی خانواده و تیم
- KeePassXC: محلی، رایگان، بدون کلاد
# تولید رمز قوی ۲۸ کاراکتری با urandom
head -c 28 /dev/urandom | base64 | tr -d '=+/' | head -c 28
# خروجی نمونه: 7Xk2pNqR9vT8mZ3aL5bW6yH1jF4dCاحراز هویت چندعاملی (MFA)
MFA ترکیب دو یا چند عامل از سه دسته است:
| عامل | مثال |
|---|---|
| چیزی که میدانید | رمز عبور، PIN |
| چیزی که دارید | توکن سختافزاری، گوشی |
| چیزی که هستید | اثر انگشت، چهره، عنبیه |
روشهای رایج MFA
- SMS OTP: کد یکبارمصرف با پیامک. ساده اما آسیبپذیر به SIM-swap.
- TOTP: کد یکبارمصرف بر اساس زمان با اپلیکیشن Google Authenticator یا Aegis. استاندارد RFC 6238.
- Push Notification: تأیید درخواست ورود در اپ موبایل.
- Hardware Key: کلید فیزیکی مانند YubiKey با استاندارد FIDO2/WebAuthn.
آسیبپذیری SMS MFA
حملات SIM-swap که در آن مهاجم با فریب اپراتور، شمارهٔ قربانی را به سیمکارت خود منتقل میکند، میتواند MFA مبتنی بر SMS را دور بزند. در ۲۰۲۲، حملهای به حسابهای Coinbase با همین روش ۹۰۰ هزار دلار سرقت کرد. در صورت امکان، از TOTP یا کلید سختافزاری استفاده کنید.
مقایسهٔ روشهای MFA
| روش | سهولت | امنیت | هزینه |
|---|---|---|---|
| SMS OTP | بالا | پایین | پایین |
| TOTP (Google Authenticator) | متوسط | متوسط | رایگان |
| Push Notification | بالا | متوسط | متوسط |
| Hardware Key (YubiKey) | متوسط | بسیار بالا | ۴۰ تا ۸۰ دلار |
ورود یکپارچه (SSO) و پروتکلهای مدرن
SSO به کاربر اجازه میدهد با یک ورود، به چند سرویس دسترسی یابد. سه پروتکل اصلی:
- SAML 2.0: مبتنی بر XML، رایج در سازمانهای بزرگ (Enterprise).
- OAuth 2.0: چارچوب اجازهٔ دسترسی (Authorization)، نه AuthN. اغلب برای دسترسی API به دادهٔ کاربر در سرویس دیگر.
- OpenID Connect (OIDC): لایهٔ احراز هویت بالای OAuth 2.0، مبتنی بر JWT.
تفاوت مهم
OAuth 2.0 بهتنهایی برای ورود استفاده نشود؛ این یک اشتباه رایج است که منجر به حملههای سطح بالا شده. برای ورود، همیشه از OpenID Connect که لایهٔ id_token را اضافه میکند استفاده کنید.
توکنهای JWT
JWT (JSON Web Token) فرمت فشردهٔ ارسال اطلاعات بین طرفین است. سه بخش با نقطه جدا میشوند:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 ← Header (الگوریتم)
.eyJzdWIiOiIxMjM0IiwibmFtUiJ9 ← Payload (ادعاها)
.SflKxwRJSMeKKF2QT4fwpM ← Signature (امضا)Header و Payload با base64url رمزگذاری شدهاند (نه رمزگذاری!) و Signature با کلید سرور ساخته میشود.
ملاحظات امنیتی JWT
- در الگوریتم
HS256کلید باید حداقل ۲۵۶ بیت و کاملاً تصادفی باشد. - هرگز الگوریتم را به
noneتنظیم نکنید؛ این یک حملهٔ کلاسیک است. - مدت انقضای کوتاه (۱۵ دقیقه) با refresh token طولانیتر ترکیب کنید.
- در
Payloadاطلاعات حساس قرار ندهید؛ این بخش فقط base64 است.
نمونهٔ ساخت JWT در Node.js
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ userId: 123, role: 'admin' },
process.env.JWT_SECRET,
{ algorithm: 'HS256', expiresIn: '15m' }
);
// تأیید
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
console.log(decoded.userId);
} catch (err) {
console.log('توکن نامعتبر');
}مدیریت نشست (Session)
نشست سمت سرور جایگزین JWT در بسیاری از اپلیکیشنهاست. کلیدها در کوکی ذخیره میشوند و دادهٔ نشست در پایگاهدادهٔ سرور.
پرچمهای امنیتی کوکی
Set-Cookie: session=abc123;
HttpOnly; ← جلوگیری از خواندن با JavaScript (ضد XSS)
Secure; ← فقط روی HTTPS ارسال شود
SameSite=Strict; ← جلوگیری از CSRF
Max-Age=3600; ← انقضای ۱ ساعته
Path=/;توکن CSRF
برای جلوگیری از جعل درخواست Cross-Site، یک توکن تصادفی در فرم قرار میدهید و سمت سرور تأیید میکنید. با کوکی SameSite=Strict در مرورگرهای مدرن، بسیاری از حملات CSRF مسدود میشوند، اما توکن CSRF هنوز بهترین کاربرد برای فرمهای حساس است.
احراز هویت زیستی
اثر انگشت، چهره و عنبیه راحتترین روش برای کاربر هستند، اما نگرانیهای جدی دارند:
- غیرقابلتغییر: اگر رمز عبور لو برود، عوض میکنید؛ اما اثر انگشت برای همیشه لو رفته است.
- خطای نادرست مثبت: در سیستمهای ضعیف، عکس چهره میتواند جای چهره واقعی را بگیرد.
- حریم خصوصی: دادهٔ زیستی نباید در سرور ذخیره شود؛ در دستگاه (مانند Secure Enclave اپل) نگهداری و فقط تأیید برگردانده شود.
معماری اعتماد صفر (Zero Trust)
اصل سنتی «قلعه و خندق» میگوید هر آنچه داخل شبکه است قابل اعتماد است. در حالی که با حضور کار از راه دور و کلاد، مرز شبکه محو شده. Zero Trust این اصل را مطرح میکند:
- هیچکس اعتماد پیشفرض ندارد، حتی کاربر داخل شبکه.
- هر درخواست باید احراز هویت و اجازهٔ دسترسی شود.
- کمینهدسترسی اعمال شود.
- مانیتورینگ و لاگنویسی مداوم.
تمرین عملی: راهاندازی ۲FA با Google Authenticator
۱. روی حساب گوگل خود وارد شوید و به بخش Security بروید.
۲. بخش 2-Step Verification را فعال کنید.
۳. روش Authenticator app را انتخاب کنید.
۴. QR کد را با اپ Google Authenticator یا Aegis اسکن کنید.
۵. کد ۶ رقمی تولید شده را وارد کنید.
۶. کدهای پشتیبان (Backup codes) را در مکانی امن ذخیره کنید.
برای راهاندازی TOTP در سرور خود میتوانید از کتابخانهٔ pyotp استفاده کنید:
import pyotp
import qrcode
# تولید secret یکبار برای هر کاربر
secret = pyotp.random_base32()
print("Secret:", secret)
# تولید URI برای QR
uri = pyotp.totp.TOTP(secret).provisioning_uri(
name="alice@example.com",
issuer_name="MyApp"
)
qrcode.make(uri).save("qrcode.png")
# تأیید کد ورودی کاربر
totp = pyotp.TOTP(secret)
print("Valid:", totp.verify(input("Enter code: ")))کدهای پشتیبان
کدهای پشتیبان تنها راه بازیابی حساب در صورت گمشدن گوشی هستند. آنها را در مدیریتگر رمز عبور یا چاپشده در گاوصندوق نگهداری کنید. بدون این کدها ممکن است حساب شما برای همیشه از دسترس خارج شود.
خلاصه و گام بعدی
در این فصل با AuthN و AuthZ، امنیت رمز عبور، MFA، SSO، JWT، مدیریت نشست و Zero Trust آشنا شدید. ترکیب TOTP یا کلید سختافزاری با مدیریتگر رمز عبور، اکنون حداقل امنیتی هر کاربر اینترنتی است.
در فصل بعد به امنیت شبکه میپردازیم؛ جایی که تمام این ترافیک عبور میکند.
این صفحه در تاریخ ۸ تیر ۱۴۰۵ بهروزرسانی شده است.