۱    مقدمه

WebLogic

پروتکل‌های SSL و TLS جهت امن کردن ارتباط میان کاربر و سرور از طریق تصدیق هویت، رمزنگاری و صحت، طراحی و پیاده‌سازی شده است. جهت امن کردن داده‌ها این پروتکل‌ها از cipher suite هایی استفاده می‌کنند. هر cipher suite ترکیبی از الگوریتم‌های اصالت‌سنجی، رمزنگاری و کد تصدیق هویت پیغام (MAC) است. در زمان پیکربندی SSL/TLS باید تنظیمات به‌درستی انجام شده و cipher suite های امن مورد استفاده قرار گیرد.

علاوه بر آن، باید تنظیمات دیگری جهت امن­‌سازی SSL انجام شود که برخی از مهم‌ترین این تنظیمات شامل غیرفعال کردن SSL 2.0 و SSL 3.0، غیرفعال کردن TLS 1.0 Compression و cipher suite های نا امن است. پیکربندی ارائه شده بر روی سروری با مشخصات زیر انجام شده است.

نام نرم‌افزار

نسخه‌ی مورد استفاده

سیستم‌عامل

Linux

وب سرور

WebLogic 10.3.6

۲    ارزیابی وضعیت فعلی سرویس دهنده

برای ارزیابی وضعیت امنیتی SSL/TLS در سرویس دهنده خود از سرویس‌­ زیر استفاده نمایید:

https://sslcheck.certcc.ir

پس از انجام موارد امنیتی زیر مجدداً با استفاده از آدرس‌های فوق سرویس خود را پویش کنید تا از برطرف شدن مشکلات موجود مطمئن شوید.

۳    فعال‌سازی ارتباطات HTTPS

برای پیکربندی سرویس‌دهنده HTTPS و استفاده از این پروتکل ابتدا باید گواهی‌نامه دیجیتال مربوطه را از مراکز صدور گواهی   (CA[1])معتبر دریافت کرد (یا گواهی Self-sign را تولید کرد). گرفتن گواهی دارای مراحلی است که برای اطلاعات بیشتر در این زمینه می‌توانید به گزارش ارائه شده توسط پژوهشکده آپای دانشگاه صنعتی امیرکبیر که در آدرس زیر قرار دارد مراجعه کنید:

https://apa.aut.ac.ir/?p=971

مزایای گواهی‌نامه‌های صادر شده از یک مرکز صدور گواهی مورد اعتماد این است که گواهی‌نامه، توسط یک مرکز ریشه مورد اعتماد امضا شده و مورد اعتماد همه است. با این حال، در اختیار داشتن گواهی‌نامه‌های صادر شده از یک مرکز صدور گواهی، نیازمند هزینه بیشتری است. بنابراین می­توان در شبکه­ی داخلی از یک گواهی Self-sign استفاده کرد. در غیر این صورت باید گواهی از یک مرکز ریشه معتبر دریافت شده و مورد استفاده قرار گیرد.

در این گزارش، در ابتدا چگونگی ایجاد و استفاده از گواهی‌نامه‌های Self-sign در WebLogic شرح داده خواهد شد. سپس نحوه­ی امن‌­سازی پروتکل SSL بر روی WebLogic آورده خواهد شد.

مرحله اول: کلید‌های identity میزبان و Keystore  را تولید کنید.

در این بخش چگونگی استفاده از یک Keytool جهت تولید گواهی‌نامه‌های قدرتمند و همچنین JCEKS keystore  ها برای یک دامنه، شرح داده خواهد شد.

دستوری که در ادامه می‌آید هر دو گواهی‌نامه دامنه و keystore را توسط keytool می‌سازد. گواهی‌نامه یا کلید توسط SHA256 با تاریخ انقضای ۳ سال امضا می‌شود. برای تولید کلید از دستورhostname –f استفاده شده که تولید کلید و keystore را بر اساس نام سرور ایجاد می­کند. بخش­هایی که با رنگ قرمز مشخص شده را باید بر اساس مقادیر مناسب، مقداردهی کرد.

 

keytool -genkey -alias `hostname -f` -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 1095 -keypass mykeypass -storetype jceks -keystore `hostname -f`_identity.jck -storepass mystorepass -dname “CN=`hostname -f`, OU=MyOU,O=MyORG, L=MyCity, S=MyState, C=MyCountryCode

مرحله ۲: identity مربوط به گواهی root را استخراج کنید.

در این مرحله باید identity گواهی‌نامه را از شناسه keystore استخراج کنیم. این شناسه گواهی‌نامه در مرحله بعد در یک keystore مورد اعتماد وارد می‌شود. مقدار مربوط به پارامتر storepass، مقداری است که در دستور قبل به پارامتر داده شده است.

keytool -export -alias `hostname -f` -file `hostname -f`.cer -keystore `hostname -f`_identity.jck -storepass password

مرحله ۳: شناسه گواهی‌نامه را درKeystore  مورد اعتماد وارد کنید.

در این مرحله نیاز است تا یک keystore مورد اعتماد JCEKS ایجاد شود. Keystroe مورد اعتماد شامل زنجیره‌های cert یا گواهی‌نامه‌هایی می‌شود که برای ایجاد اعتماد در طی SSL handshake استفاده شده‌اند.

keytool -import -alias `hostname -f` -file `hostname -f`.cer -keystore `hostname -f`_trust.jck -storetype jceks -storepass mystorepass -noprompt

هنگامی که گواهی‌نامه‌ها وkeystore ها ساخته شدند، باید در یک فضای امن (یک دایرکتوری با دسترسی محدود) ذخیره گردند. باید owner مربوط Weblogic server دسترسی Read_Only به cert ها و  keystoreها داشته باشد.

مرحله ۴: تنظیمات SSL را بررسی کنید.

در ابتدا باید SSL listener و پورت مربوط به آن را تنظیم کرد.

  1. در کنسول مدیریتی، به بخش تنظیمات سرور بروید:
    Environment > Servers > Admin Server
  2. گزینهSSL Listen Port Enabled  را فعال کنید.
  3. به پورت وارد شده برای SSL توجه کنید.
  4. تغییرات را ذخیره کنید.

شکل 1: فعال کردن SSL listener

شکل ۱: فعال کردن SSL listener

 

مرحله ۵: تنظیم کردن Keystore های Weblogic

حالا که keystore ها و گواهی‌نامه‌های که برای شناسایی و اعتماد تولید شدند، باید بر روی WebLogic تنظیم گردد تا از آن‌ها استفاده کند.

  1. admin server را start کنید.
  2. به کنسول admin وارد شوید.
  3. مسیر Environment > Servers > Admin Server را پیدا کنید.
  4. بر روی تب Keystore کلیک کنید.
  5. بر روی دکمهchnage در بخش  Keystore کلیک کرده و “Custom Identity and Custom Trust“ را انتخاب کنید.
  6. در زیرمجموعه Custom Identity Keysotre مسیر کامل شناسه keystore (که با نام `hostname –f`_identity.jck تولید شد) را مشخص کنید.
  7. نوعCustom Identity Keystore را در زیرمجموعه JCEKS مشخص کنید.
  8. کلمه­ی عبور (که در هنگام تولید کلید مورد استفاده قرار گرفت) را برای شناسه keystore در زیرمجموعه Custom Identity Keystore Passphrase مشخص کنید.
  9. همان‌گونه که شناسه keystore را تنظیم کردید، Custom Trust Keystore   (که با نام `hostname –f`_trust.jck تولید شد) و نوع Custom Trust Keystore  و عبارت عبور را نیز تنظیم کنید.
  10. تغییرات را ذخیره کنید.

شکل زیر، محیط مربوطه را نشان می‌دهد.

شکل 2: تنظیم keystoreها

شکل ۲: تنظیم keystoreها

مرحله ۶: WebLogic SSL را تنظیم کنید.

بعد از پیکربندی مربوطه به keystore ، ما می‎توانیم SSL را برای WebLogic تنظیم کنیم.

  1. بر روی تب SSL کلیک کنید.
  2. Private Key Alias را مشخص کنید. از نام ‌مستعاری (قرار گرفته بعد از پارامتر -alias) استفاده کنید که هنگام ساخت کلید خصوصی و شناسه keystore، تعیین کرده‌اید.
  3. کلمه­ی عبور کلید خصوصی را مشخص کنید.
  4. بر روی Save کلیک کنید.

عکس زیر پیکربندی‌های مربوطه را نشان می‌دهد.

شکل 3: تنظیمات SSL

شکل ۳: تنظیمات SSL

  1. سپس بر روی گزینه advance کلیک کنید.
  2. گزینه مربوط به Use JSSE SSL را فعال کنید (برای نسخه­های ۱۰g و ۱۱g).
  3. در انتها گزینه save را بزنید.

مرحله ۷: فعال کردن debugging بر روی SSL (اختیاری)

بعد از فعال کردن SSL بر روی Weblogic ممکن است به دلایل مختلف مشکلاتی ایجاد شود، که فعال کردن debugging می­تواند به شناسایی مشکلات کمک کند. جهت فعال کردن آن باید مراحل زیر را انجام داد:

  1. در ابتدا باید با استفاده از یک ویرایشگر اسکریپت sh قرار گرفته در مسیر $DOMAIN_HOME/bin/ باز شود.
  2. سپس خط زیر باید برای پارامتر JAVA_OPTIONS اضافه گردد.
-Dssl.debug=true -Dweblogic.StdoutDebugEnabled=true

شکل 4: نحوه فعال سازی debuggingشکل ۴: نحوه فعال سازی debugging

۴    موارد پیشنهادی برای ارتقای امنیت

در این بخش چگونگی پیکربندی امن SSL/TLS را در سرویس‌دهنده وب Weblogic بیان می‌کنیم. مواردی همچون استثنا کردن برخی الگوریتم‌های رمز به منظور کاهش حملاتی شبیه به FREAK، CRIME و LogJAM، غیرفعال‌سازی نسخه‌های ناامن SSL، برقرار کردن رمزنگاری‌های قوی که از (FS) Forward Secrecy پشتیبانی می‌کنند را بیان می‌کنیم.

نکته: ذکر این نکته لازم است که بسیاری از تنظیمات مانند cipher order و HPKP و … توسط WebLogic پشتیبانی نمی­شود.

۴٫۱ تنظیم الگوریتم‌های قدرتمند و Forward secrecy

SSLv2 و SSLv3 (به خاطر حمله POODLE) ناامن هستند و باید غیرفعال شوند. برای غیرفعال‌سازی SSL، خط زیر را در فایل setDomainEnv.sh، قرار گرفته در مسیر $DOMAIN_HOME/bin/ اضافه کنید. پارامتر JAVA_OPTIONS را پیدا کرده و خط زیر را به آن اضافه کنید.

-Dweblogic.security.SSL.protocolVersion=TLSv1

خط بالا به Weblogic می‌گوید که SSL را غیرفعال کرده و فقط از TLS 1.0، TLS 1.1  یا TLS 1.2 استفاده کند. شما همچنین می‌توانید با اضافه کردن دستور زیر به خط JAVA_OPTIONS، حداقل نسخه قابل پشتیبانی را مشخص کنید:

weblogic.security.SSL.minimumProtocolVersion=[protocol]

که [protocal] می‌تواند شامل موارد زیر باشد:

  • TLSv1
  • TLSv1.1
  • TLSv1.2

همچنین با اضافه کردن پارامترهای زیر به JAVA_OPTIONS، نیز می­توان امکان استفاده از cipherهای ضعیف را غیرفعال کرد.

-Dweblogic.security.SSL.allowUnencryptedNullCipher=false

-Dweblogic.security.disableNullCipher=true

علاوه بر موارد ذکر شده، باید Forward Secrecy نیز فعال شود. Forward Secrecy اطمینان می‌دهد که صحت[۲] یک کلید جلسه[۳] حتی وقتی که کلیدهای زیادی مورد مخاطره قرار گرفتند، حفظ می‌شود. FS کامل[۴] این مورد را با استخراج یک کلید جدید برای هر جلسه، به انجام می‌رساند. این بدان معناست که زمانی که کلید خصوصی به مخاطره افتاد، نمی‌تواند برای رمزگشایی ترافیک SSL مورد استفاده قرار گیرد. جهت تنظیم cipher Suite‌های قدرتمند و Forward secrecy می‌توان از دستورات زیر استفاده کرد. خط‌های زیر را در $DOMAIN_HOME/config/config.xml  وارد کنید. برای پشتیبانی ازAES 256، نیاز دارید تا بسته JCE  را برای JDK  نصب کنید.

<server>

<name>AdminServer</name>

<ssl>

<enabled>true</enabled>

<ciphersuite>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA256</ciphersuite><ciphersuite>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</ciphersuite><ciphersuite>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA256</ciphersuite><ciphersuite>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256</ciphersuite><ciphersuite>TLS_DHE_DSS_WITH_AES_256_CBC_SHA</ciphersuite><ciphersuite>TLS_DHE_DSS_WITH_AES_256_CBC_SHA256</ciphersuite><ciphersuite>TLS_DHE_DSS_WITH_AES_128_CBC_SHA</ciphersuite><ciphersuite>TLS_DHE_DSS_WITH_AES_128_CBC_SHA256</ciphersuite><ciphersuite>TLS_RSA_WITH_AES_256_CBC_SHA</ciphersuite><ciphersuite>TLS_RSA_WITH_AES_256_CBC_SHA256</ciphersuite><ciphersuite>TLS_RSA_WITH_AES_128_CBC_SHA</ciphersuite><ciphersuite>TLS_RSA_WITH_AES_128_CBC_SHA256</ciphersuite><ciphersuite>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384</ciphersuite><ciphersuite>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384</ciphersuite><ciphersuite>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA</ciphersuite><ciphersuite>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256</ciphersuite>         <ciphersuite>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256</ciphersuite>

<hostname-verifier xsi:nil=”true”></hostname-verifier>

بعد از پیکربندی با استفاده از اسکریپت دردسترس در آدرس زیر، می­توان بررسی کرد که چه مرورگرهایی امکان ارتباط با سرور را خواهند داشت.

https://testssl.sh/testssl.sh

۴٫۲ به‌روزرسانی نرم‌افزارها و نسخه‌ها

یکی از توصیه‌های مهم درزمینه‌ی پیکربندی امن SSL/TLS به روزبودن نسخه‌ی وب سرور و نصب آخرین وصله‌های امنیتی بر روی آن است.

۴٫۳ فعال کردن  OCSP Stapling

OCSP Stapling روشی برای بالا بردن سرعت در چک کردن لیست ابطال کلید برای گواهی است. با استفاده از OCSP Stapling  نیاز نیست که سرویس گیرنده درخواستی را به سرور OCSP بدهد و با استفاده از اطلاعات مهیا شده همراه گواهی، می‌تواند از باطل نبودن گواهی اطمینان حاصل کند.

برای فعال کردن آن بر روی وب سرور می‌توان مراحل زیر را انجام داد:

  1. در سمت چپ پنل مدیریتی بر در بخش Domain Structure بر روی نام دامنه کلیک کنید.
  2. سپس از مسیر Security > SSL Certificate Revocation Checking > General وارد شده و گزینه­ی Enable Certificate Revocation Checking را فعال کنید.
  3. در بخش Revocation Checks نیز می­تواند روش certificate revocation checking را انتخاب کنید.
  4. سپس بر روی گزینه­ی save کلیک کنید.

شکل 6: تنظیم OCSP

شکل ۶: تنظیم OCSP

۴٫۴ فعال کردن HSTS

HTTP Strict Transport Security یک بهبود امنیتی برای برنامه‌های تحت وبی است که از پروتکل HTTPS استفاده می‌کنند. وجود این مکانیسم باعث جلوگیری از  Downgrade Attack  وCookie Hijacking می‌شود. این قابلیت همچنین مرورگر را ملزم می‌کند که حتماً از پروتکل HTTPS برای ارتباط با سرور استفاده کند.

پیکربندی مشخصی برای فعال‌سازی HSTS در weblogic وجود ندارد (مانند فعال کردن یک گزینه در کنسول مدیریتی) و برای این کار نیاز است که یک فیلتر ایجاد و به web application مورد نظر اضافه گردد. در ابتدا باید خطوط زیر به فایل web.xml قرار گرفته در مسیر $MW_HOME/ wlserver/server/lib/consoleapp/webapp/WEB-INF/web.xml (البته مسیر ممکن است در برخی از موارد به علت انتخاب نام متفاوت تفاوت جزئی داشته باشد) اضافه گردد:

<filter>

<filter-name>HSTSFilter</filter-name>
<filter-class>security.HSTSFilter</filter-class>

</filter>

برای ایجاد فیلتر بالا (security.HSTSFilter) باید به صورت زیر عمل کرده و سپس آن را به web application  اضافه کرد:

package security;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class HSTSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) res;

if (req.isSecure())
resp.setHeader(“Strict-Transport-Security”, “max-age=31622400; includeSubDomains”);

chain.doFilter(req, resp);
}

}

همچنین برای هدایت خودکار ارتباطات HTTP به  HTTP می‌توانید مقدار ‘transport-guarantee’ را به صورت CONFIDENTIAL یا INTEGRAL در web.xml قرار دهید که weblogic، کلاینت‌هایی که از HTTP استفاده می‌کنند را به صورت خودکار به سمت HTTPS مسیردهی می‌کند. خطوط زیر باید در فایل web.xml درون تگ security-constraint قرار داده شود.

<user-data-constraint>
<description>
This is how the user data must be transmitted.
</description>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

۴    مراجع

[۱] https://docs.oracle.com/middleware/1221/wls/LOCKD/practices.htm#LOCKD124

[۲] https://docs.oracle.com/cd/E13222_01/wls/docs81/webserv/security.html

[۳] http://www.oracle.com/technetwork/articles/soa/patil-certrevoc-1873528.html

[۴] https://docs.oracle.com/cd/E24329_01/web.1211/e24422/ssl.htm#SECMG384

[۵] https://stackoverflow.com/questions/38971541/how-can-we-enable-hstshttp-strict-transport-security-in-weblogic-server

[۶] https://serverfault.com/questions/693876/how-can-the-hsts-header-be-added-to-weblogic

[۷] http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SunJSSEProvider

[۸] http://weblogic-wonders.com/weblogic/2014/06/24/recommended-best-practices-securing-weblogic-server/

[۹] http://remotepsadmins.com/2015/01/24/ssl-weblogic/


[۱] Certificate Authority

[۲] Integrity

[۳] Session Key

[۴] Perfect Forward Secrecy


دریافت نسخه PDF