محافظت از API های خود با KeyCloak

در ادامه پست ، من وقت خود را در مورد بازنمایی معماری برنامه با نمودارهای C4 ایجاد کردم ، در این پست وقتی در مورد توسعه استراحت API صحبت می کنیم ، این امنیت است. برای مثال ایمنی استراحت API ، من نمونه ای از اجرای یکی از مؤلفه های معماری را که در نمودار پست قبلی ارائه شده است ، ارائه می دهم. در این پست من اجرای میکروسرویس را ارائه می دهم ecommerce-ms-product
با Java 17 ، JPA و Boot Spring پیاده سازی شده است. برای امنیت API من از KeyCloak به عنوان هویت و مدیریت دسترسی (AMI) استفاده کردم.
مدیریت هویت و دسترسی (AMI) چیست؟
مدیریت هویت و دسترسی نظارت بر تأیید اعتبار کاربر و در دسترس بودن منابع را ارائه می دهد. این فناوری که اغلب به عنوان AMA گفته می شود ، تضمین می کند که افراد مناسب در زمان مناسب و به دلایل مناسب به منابع دیجیتالی مناسب دسترسی پیدا کنند.
مفاهیم اساسی در مورد
یکی منبع دیجیتالی این به هر ترکیبی از برنامه ها و داده ها در یک سیستم رایانه ای اشاره دارد. مثالها شامل برنامه های وب ، API ها ، سیستم عامل ها ، دستگاه ها و بانکهای اطلاعاتی است.
در مرکز هوش مصنوعی هویتبشر شخصی می خواهد به درخواست شما ، چه مشتری ، کارمند ، عضو یا شرکت کننده ، دسترسی پیدا کند. در زمینه AMI ، یک حساب کاربری با a مطابقت دارد هویت دیجیتالیبشر علاوه بر نمایندگی افراد ، این حساب ها همچنین ممکن است با عناصر غیر انسانی مانند نرم افزار ، اینترنت اشیاء (IOT) یا روبات ها همراه باشد.
بوها احراز هویت این شامل تأیید هویت دیجیتال است ، و اطمینان می دهد که کسی (یا چیزی) ثابت می کند که کسی است که ادعا می کند.
من و اعتبار تعیین کنید که چه ویژگی هایی یک کاربر مجاز به دسترسی است.
استانداردهای احراز هویت و مجوز برای اطمینان از ایمنی و کارآیی سیستم های مدیریت هویت (AMI) ضروری است. شناخته شده ترین و به طور گسترده در صنعت شامل موارد زیر است:
OAUTH 2.0: پروتکل مجوز که امکان دسترسی ایمن به منابع را بدون قرار گرفتن در معرض اعتبار فراهم می کند.
OpenID Connect (OIDC): OAUTH 2.0 پسوند برای تأیید اعتبار ، به کاربران امکان شناسایی ایمن می شود.
SAML (زبان نشانه گذاری امنیت): پروتکل مبتنی بر XML که برای تأیید اعتبار و تبادل اطلاعات هویت بین سیستم های مختلف استفاده می شود.
fido2/webauthn: استاندارد رمز عبور بدون رمز عبور ، بر اساس کلیدهای رمزنگاری.
LDAP (پروتکل دسترسی به فهرست سبک وزن): پروتکل برای دسترسی و نگهداری دایرکتوری های اطلاعاتی در مورد کاربران و دستگاه ها استفاده می شود.
این الگوهای به طور گسترده ای برای مدیریت هویت ، محافظت از داده های شخصی و کنترل دسترسی به منابع ، ایمن ترین و مطمئن ترین در نظر گرفته می شوند.
اعتبار مشتری جریان دارد
در اجرای من از جریان اعتبار مشتری (تعریف شده در OAUTH 2.0 RFC 6749 ، بخش 4.4) استفاده کردم ، شامل یک برنامه کاربردی است که اعتبار برنامه خود ، مانند شناسه مشتری و راز مشتری را برای یک نشانه دسترسی می کند.
این جریان برای برنامه های کاربردی دستگاه به ماشین (M2M) مانند کلین ، Daemon یا Backend Services مناسب است ، زیرا سیستم باید به جای کاربر ، برنامه را تأیید و مجاز کند.
در عمل
در اجرای میکروسرویس تجارت اقتصادی من دو مجموعه منابع ایجاد کردم:
/produtos
/categorias
در آنها نقاط پایانی را برای ایجاد ، مشاوره حذف و به روزرسانی این ویژگی ها پیاده سازی کردم. برای محافظت از این نقاط پایانی ، به گونه ای که فقط توسط کسانی که اعتبار لازم را دارند ، به آنها دسترسی پیدا می کند ، من در Aquivo اضافه کردم application.properties
از پروژه به ورودی زیر:
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:7080/realms/security-ecommerce-api
این ورودی برنامه را برای استفاده از قلمرو پیکربندی می کند security-ecommerce-api
که در Keycloak ایجاد شده است
من همچنین امکانات بهاری زیر را در پروژه اضافه کردم:
org.springframework.security
spring-security-config
org.springframework.boot
spring-boot-starter-oauth2-resource-server
با وجود این وابستگی ها در پروژه ، نقاط پایانی پروژه در حال حاضر در دسترس نیست و فقط توسط کسانی که دارای اعتبار مناسب هستند ، قابل دسترسی است.
پیکربندی امنیتی-عضو-شرکت-API
در منطقه داخلی KeyCloak ، یک قلمرو جدید ایجاد کنید:
در قلمرو ایجاد شده ، به منوی مشتری بروید و یک مشتری جدید ایجاد کنید:
در مثال ما ، شناسه مشتری را ایجاد کردم ecommerce-client
، راز مشتری توسط KeyCloak تولید می شود و در برگه اعتبار ارائه می شود:
آزمایش API ایمن
برای آزمایش این اجرای ، من از پسوند VScode ، REST Client برای انجام درخواست ها استفاده کردم:
پیکربندی برای کلید محلی Cloak
برای اجرای KeyCloak محلی ، از Docker و Composis برای صعود از خدمات MySQL برای پایگاه داده KeyClaak و Keyclaak استفاده کردم.
services:
mysqlsrv:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "MySql2019!"
MYSQL_DATABASE: "ecommerce-produtos"
ports:
- "3306:3306"
volumes:
- /home/paulo/Desenvolvimento/docker/mysql:/var/lib/mysql
networks:
- ecommerce-network
keycloak:
image: quay.io/keycloak/keycloak:24.0
container_name: keycloak-ecommerce
environment:
KC_HOSTNAME: localhost
KC_HOSTNAME_PORT: 7080
KC_HOSTNAME_STRICT_BACKCHANNEL: "true"
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
KC_HEALTH_ENABLED: "true"
KC_LOG_LEVEL: info
KC_DB: mysql
KC_DB_USERNAME: root
KC_DB_PASSWORD: MySql2019!
KC_DB_URL_HOST: mysqlsrv
KC_DB_URL_PORT: 3306
KC_DB_SCHEMA: keycloak
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7080/health/ready"]
interval: 15s
timeout: 2s
retries: 15
command: ["start-dev", "--http-port", "7080", "--https-port", "7443"]
ports:
- "7080:7080"
- "7443:7443"
networks:
- ecommerce-network
depends_on:
- mysqlsrv
networks:
ecommerce-network:
driver: bridge