SAML2 ضد JWT: فهم JSON Web Token (JWT)

في هذا المنشور ، بدأنا استكشاف مواصفات JSON Web Token (JWT) كجزء من سلسلة SAML v2.0 مقابل JWT. لفهم حالات استخدام JWT ، يجب علينا أيضًا أن ننظر إلى OpenID Connect v1.0 و OAuth v2.0 وبعض المواصفات ذات الصلة - مواصفات JWT في حد ذاتها ليست مثيرة للاهتمام أو مفيدة للغاية. لقد رأينا ذلك في جزء SAML 2.0 من هذه السلسلة - تم الرجوع إلى WS-Trust و WS-Security و XML DSig والعديد من المواصفات الأساسية الأخرى. مواصفات JWT أصغر بكثير من مواصفات SAML2. إنه أكثر أساسية بكثير ، حيث يحدد فقط هيكل الرمز المميز ، ولكن ليس أي من البروتوكولات التي تستخدم الرمز المميز وتجعله مفيدًا في العالم الحقيقي. تقوم مواصفات OAuth2 و OpenID Connect بذلك - هذا سيصدر قريبًا. كالعادة ، أنا قادم من وجهة نظر متجر تكنولوجيا المعلومات في المؤسسة ؛ أنا أفكر بشكل كبير ، وموجه نحو العملية ، ومراجعة الحسابات ، والكثير من القواعد ، والكثير من متطلبات الأمان ، وما إلى ذلك. قد لا يكون كل ذلك مرتبطًا بموقفك ، ولكن ربما يكون الكثير منه. هذا المنشور لا يتعلق بـ OAuth2 و OpenID Connect - سنصل إليها قريبًا.

نبذة تاريخية عن JWT

كانت المسودات الأولى لمواصفات JWT تسمى OpenID Artifact Binding المقترحة. تم نشر المسودة الأولى لمواصفات JWT في يوليو 2011 - لاحظت أن هذه المواصفات المنشورة الأقدم لا تشير إلى JSON Web Signature (JWS) أو JSON Web Encryption (JWE). تأثرت الإصدارات المبكرة من هذه المواصفات بالرغبة في الحصول على رمز هوية يستند إلى JSON يدعم التوقيعات والتشفير ، ولكن أيضًا دعم خوارزميات تشفير متعددة مع الحفاظ على روح بساطة التوقيع السحري لبروتوكول Salmon. في يوليو 2011 ، بدأت مجموعة عمل IETF WOES (توقيع تشفير كائنات الويب) (اسم مؤسف) في تمديد العمل من مواصفات CMS (تشفير رسائل الرسائل) (RFC 3852). في وقت لاحق من ذلك العام ، تم دمج مجموعات العمل JWT و WOES لتشكيل مجموعة عمل JSON لتوقيع الكائنات (JOSE). أدت مجموعة العمل هذه إلى مواصفات JWS و JWE (من بين أمور أخرى) - وهما لبنات بناء أساسية لمواصفات JWT. تم نشر المواصفات JWT (RFC 7519) ، JWS Spec (RFC 7515) ، و JWE Spec (RFC 7516) في مايو 2015.

ما هو JWT؟

تعرّف JSON Web Token Spec (RFC 7519) نوعًا من الرمز المميز لحامل يمكن أن يحتوي على المفتاح: أزواج قيمة من السمات التي يتم استخدامها لتلبية نماذج أمان التحكم في الوصول المستند إلى الدور (RBAC) أو التحكم في الوصول إلى السمة (ABAC). من المواصفات ،

JSON Web Token (JWT) هي وسيلة مدمجة وآمنة لعناوين URL لتمثيل المطالبات التي يتعين نقلها بين طرفين. يتم ترميز المطالبات في JWT ككائن JSON الذي يتم استخدامه كحمولة هيكل JSON Web Signature (JWS) أو كنص عادي لبنية JSON Web Encryption (JWE) ، مما يتيح المطالبات الموقعة رقميًا أو حماية التكامل مع رمز مصادقة الرسائل (MAC) و / أو المشفرة.

الرموز المميزة لـ JWT هي بنية بيانات JSON (RFC 4627) مع اسم: أزواج القيمة التي تمثل المطالبات التي تشكل حمولة بنية JWS (أو نص عادي JWE كما هو موضح أعلاه). تعني إمكانيات توقيع JWS المعلومات الموجودة في الرمز المميز ويمكن التحقق من مصدرها بواسطة أطراف ثالثة دون الرجوع إلى موفر الهوية الذي أنشأ الرمز المميز. تعني إمكانات تشفير JWE أن الأطراف المرغوبة فقط هي القادرة على قراءة محتويات الرمز المميز.

يحتوي JWT على نص يستند إلى JSON يحتوي على (أو يمكن أن يحتوي) على معلومات حول:

  • الرئيسي المصدق (الموضوع)
  • سمات الأمان المخصصة التي تصف المستخدم (المطالبات الخاصة)
  • معلومات حول IdP (المُصدر)
  • معلومات حول SP (معلومات الجمهور)
  • إطار زمني صالح (تاريخ البدء ، تاريخ انتهاء الصلاحية ، تاريخ الإصدار)
  • توقيع إلكتروني
  • كيف تمت المصادقة الرئيسية
  • معلومات التشفير

كتبت قائمة متطابقة تقريبًا في الوصف الأصلي لـ SAML2 في هذه السلسلة ، مما يشير إلى أن هاتين التقنيتين متشابهتان للغاية.

تمامًا كما رأينا في منشور مدونة JWS ، تتضمن بنية الرمز المميز JWT:

  • رأس
  • الحمولة
  • التوقيع

مثال نموذجي لحمولة JWT (تم إنشاؤه بواسطة AAD) هو:

{
  "aud": "https://app1.levvel.io/login" ،
  "iss": "https://sts.windows.net/75de389c-8f67-4084-9065-3a9c31e1db13/" ،
  "iat": 1483691542 ،
  "nbf": 1483691542 ،
  "إكسب": 1483695442 ،
  "acr": "1" ،
  "عمرو": [
    "الأشخاص ذوي الإعاقة"
  ]،
  "appid": "80363411-f180–4a51–80ba-9b63770b9ac4" ،
  "appidacr": "0" ،
  "family_name": "User1" ،
  "given_name": "Test" ،
  "ipaddr": "1.1.1.1" ،
  "الاسم": "اختبار المستخدم 1" ،
  "oid": "42cd4e91–1c39–45ec-a0cb-13361157487b" ،
  "platf": "14" ،
  "scp": "user_impersonation" ،
  "sub": "Hd6Ymh1ICumL3_MxJcdM1LaVFlbkSCNmmo6wlG7OFDg" ،
  "tid": "75de389c-8f67–4084–9065–3a9c31e1db13" ،
  "unique_name": "test1@rcbj.net" ،
  "upn": "test1@rcbj.net" ،
  "ver": "1.0"
  "الأدوار": [
    "المستعمل"
  ]
}

سيبدو رأس JWT بشكل مثل:

{
 typ: "JWT" ​​،
 على سبيل المثال: "RS256" ،
 x5t: "kriMPdmBvx68skT8-mPAB3BseeA"
}

استخدمت رمزًا مميزًا لـ AAD JWT في هذا المثال لأنه نظام أساسي أتعرف عليه وله العديد من الميزات المفيدة في مساحة هوية المؤسسة.

هذه المكونات هي قاعدة 64 مشفرة ويفصل بينها "." اذا لدينا:

BASE64URL (UTF8 (JWS Protected Header)) || ‘. '|| BASE64URL (JWS Payload) || ‘. '|| BASE64URL (توقيع JWS)

مثل الهيكل العام لرمز JWT. هذا سيبدو:

eyJhbGciOiJSUzI1NiJ9.eyJhIjoiYiIsImMiOiJkIiwiZSI6MX0.CNMaYaDGU3ZhFV1ve6p3sAdYXhEklej8DVIAMqIWCkpNmT6Jp7iigcndXwH5q3WQFHiswgIQU5 -_- 4rV3jKGptCROmEyWPW8_elhYH1apzAyjOjyZ55ygv37xKHzIFhixzAwmXlAv4pfD4lVelYWVNOSN7REA0QJeCy2vKdqZ5cjqCXQ1lkQUlzOE7dpuNoAkhAhAJJ8HaamFKy7Gl7uwmqbIr-dVYv21d_9O7mO26n0gy3zWXD2nJDxU5Mzl2pZd8-sFvUr9Kmp_YkeRMh4bSe0fr1Uc_YgkjpmYUyu7kaxRWTbAdJ3GwqWFMUDiyfhHdzvZPZyU4VkWreimoydMA

يمكن الاطلاع على تفاصيل كيفية إنشاء التوقيع هنا. نحن نفترض أيضًا أنه لا يوجد تشفير (JWE) مستخدم.

تحدد مواصفات JWT المطالبات الاختيارية التالية (توجد أوصاف مفصلة في المواصفات):

مطالبة "iss" (المُصدر): الأصل الذي أصدر JWT. هذه المطالبة اختيارية.

مطالبة "sub" (Subject): الأصل الذي تم وصفه بواسطة JWT. المطالبات في JWT هي عادة بيانات حول الموضوع.

مطالبة "aud" (الجمهور): المستلم (المستلمون) الذي تم تصميم JWT من أجله. هذه القيمة عالية التطبيق (السياق) محددة.

"exp" (وقت انتهاء الصلاحية) المطالبة: وقت انتهاء الصلاحية لـ JWT. إنه رقم يحتوي على قيمة NumericDate ..

"nbf" (ليس قبل) المطالبة: الوقت الذي قبله JWT غير صالح. المطالبة اختيارية.

"iat" (تم إصدارها في) المطالبة: الوقت الذي تم إصدار JWT - يحدد فيه عمر الرمز المميز. عادة ، نفس المطالبة "nbf".

"jti" (JWT ID) الادعاء: معرف فريد لـ JWT من موفر الهوية المولد.

بالإضافة إلى ذلك ، تحدد مواصفات JWS هذه المعلمات التي يمكن استخدامها في الرموز JWT. بين مطالبات المواصفات JWS والقائمة أعلاه ، لا توجد العديد من المعلمات المطلوبة بالفعل - جانب آخر من جوانب البساطة. على الرغم من أنه من الناحية العملية ، فإن أي حالة استخدام غير تافهة ستحتوي على العديد من هذه المعايير ومن المحتمل أن تكون مجموعة متنوعة من المطالبات الخاصة أيضًا.

يمكن استخدام مطالبات خاصة إضافية طالما أن المنتج والمستهلك لرمز JWT يتفقان على استخدامها. يمكننا أن نرى مثالا على مطالبة خاصة في الرمز المميز AAD JWT أعلاه مع المطالبة "upn" - اسم المستخدم الأساسي (UPN) هو سمة Active Directory التي تصف بشكل فريد مستخدم قام بنقله إلى عالم Azure Active Directory. يمكن العثور على معلومات إضافية حول الرموز والمطالب Azure Active Directory هنا.

من أجل JWT المتولدة من AAD والمذكورة أعلاه

جمهور (aud): https://app1.levvel.io/login؛ يمثل هذا الجمهور تطبيق ويب يحتوي على عنوان URL هذا.

مُصدر (iss): يحتوي على https://sts.windows.net/75de389c-8f67-4084-9065-3a9c31e1db13/ ؛ يحدد هذا بشكل فريد المستأجر AAD الذي أنشأ هذا الرمز المميز.

"تم إصداره في" (iat) ، "ليس قبل" (nbf) ، وينتهي (exp): يحتوي على الأوقات (وصولاً إلى الثاني) من تاريخ إصدار JWT ، الوقت الذي لم يكن فيه صالحًا (عادة ما يكون هو نفسه) كما صدر في الوقت المناسب) ، والوقت تنتهي. هذه القيم في وقت عالمي منسق ؛ يمكن تحويل الأرقام إلى شكل مقروء بشري.

الإصدار (ver): تحتوي المطالبة على رقم إصدار هذا الرمز المميز - إصدار مواصفات JWT.

معرّف المستأجر (tid): المعلمة هي المعرف الفريد لمستأجر AAD الذي أنشأ هذا الرمز المميز.

طريقة المصادقة (amr): تحتوي على معلومات حول كيفية المصادقة الرئيسية (في هذه الحالة مع معرف المستخدم + كلمة المرور).

الأدوار: صفيف من السلاسل التي تحتوي على أسماء بشرية قابلة للقراءة لأدوار التطبيق ، والمدير الموصوف في هذا الرمز المميز عضو ؛ يمكن استخدام هذه المعلومات لقرارات التحكم في الوصول المستند إلى الدور - أدوار تطبيق Azure Active Directory مخصصة لنشر آخر.

معرف الكائن (oid): تحتوي المعلمة على معرف الكائن ؛ هذا يصف كائن فريد في AAD.

الاسم الرئيسي للمستخدم (upn): اسم المستخدم الرئيسي ؛ هذا هو مطالبة Microsoft الخاصة التي تنتمي إلى النموذج user @ domain (يبدو كثيرًا مثل عنوان البريد الإلكتروني ، ولكنه ليس كذلك).

unique_name: قيمة اسم قابلة للقراءة البشرية للمستخدم والتي قد لا تكون فريدة داخل المستأجر ؛ ومع ذلك ، فإن الاسم يعني خلاف ذلك - ليس متأكدا تماما ما كانوا يفكرون هناك.

معلمة الموضوع (sub): معرف فريد غير قابل للتغيير لكائن AAD يمثل الرئيسي الذي يصف الرمز المميز.

family_name: اسم العائلة (أو اللقب) للمدير.

given_name: الاسم المعطى أو الاسم الأول للمدير.

معرف التطبيق: معرف العميل الذي تم استخدامه في استدعاء OAuth (اتصال OpenID) الذي تم إنشاء الرمز المميز.

النطاق (scp): أذونات التمثيل الممنوحة للتطبيق الموضح بواسطة المعلمة appid - سنعود إلى موضوع التمثيل في سلسلة منشورات مستقبلية.

مرجع فئة سياق مصادقة التطبيق (appidacr): معلومات حول كيفية مصادقة تطبيق العميل. إذا كان العميل عامًا ، فستكون القيمة دائمًا "0" ؛ إذا كان العميل سريًا ، فستكون القيمة "1".

مرجع فئة سياق المصادقة (acr): معلومات حول كيفية المصادقة الرئيسية ؛ تشير قيمة "0" إلى أن المصادقة لا تفي بمتطلبات ISO / IEC 29115.

يتم تحديد جميع المعلمات في الرأس في المواصفات JWS وتغطيتها في مناقشتنا السابقة.

يمكن استخدام JWTs للمصادقة على المكونات من جانب الخادم (مثل واجهات برمجة التطبيقات أو الموارد الأخرى) ونشر الهوية بين ممثلي API. لقد تطرقت إلى مفهوم نشر الهوية الآمنة من قبل. هذه هي الآلية التي تنقل بشكل آمن هوية المتصل الأصلي أو يطلب من البادئ إلى أنظمة المتلقين للمعلومات إلى ما وراء ذلك حيث يشارك المتصل الأصلي (خاصةً الفاعل البشري) بشكل مباشر مثل بين بوابة API ومزود واجهة برمجة التطبيقات.

في الجزء التالي من هذه السلسلة ، سننظر في حالات استخدام JWT.