APISIX: FIPS 140-2 अनुपालन करें

Jinhua Luo

January 6, 2023

Products

FIPS 140-2 क्या है?

FIPS का मतलब है फेडरल इन्फॉर्मेशन प्रोसेसिंग स्टैंडर्ड्स, जो कंप्यूटर सुरक्षा मानकों का एक सेट है जो अमेरिकी फेडरल डिपार्टमेंट ऑफ कॉमर्स के नेशनल इंस्टीट्यूट ऑफ स्टैंडर्ड्स एंड टेक्नोलॉजी (NIST) द्वारा स्थापित किया गया है।

FIPS का लक्ष्य सभी फेडरल एजेंसियों के लिए संवेदनशील लेकिन अवर्गीकृत जानकारी की सुरक्षा के लिए एक समान स्तर की सुरक्षा बनाना है - इलेक्ट्रॉनिक डेटा का एक बड़ा हिस्सा जिसे गुप्त या उच्च नहीं माना जाता है।

FIPS 140-2 के सुरक्षा स्तर

FIPS 140-2/3 साइबर सुरक्षा संदर्भ में अक्सर उपयोग किए जाने वाले मानक हैं। ये दोनों क्रिप्टोग्राफिक मॉड्यूल के लिए मानक सुरक्षा आवश्यकताओं से संबंधित हैं। FIPS 140-3 अंततः FIPS 140-2 को प्रतिस्थापित करेगा, और यह परिवर्तन वर्तमान में चल रहा है।

  • स्तर 1 – सबसे कम सुरक्षा स्तर जो न्यूनतम आवश्यकताओं को लागू करता है और सभी घटकों को 'उत्पादन ग्रेड' होने की आवश्यकता होती है। FIPS 140-2 स्तर 1 विशेष रूप से सॉफ्टवेयर क्रिप्टोग्राफिक मॉड्यूल से संबंधित है और उन क्रिप्टोग्राफिक एल्गोरिदम के बारे में निर्धारित करता है जिनका उपयोग किया जा सकता है और उनकी अखंडता को सत्यापित करने के लिए किए जाने वाले स्व-परीक्षणों के बारे में।
  • स्तर 2भौतिक-छेड़छाड़ साक्ष्य और भूमिका-आधारित प्रमाणीकरण के लिए अतिरिक्त आवश्यकताएं।
  • स्तर 3 – हमलावरों के खिलाफ सुरक्षा को मजबूत करने, पहचान-आधारित प्रमाणीकरण के उपयोग, और इंटरफेस के बीच भौतिक अलगाव के लिए अतिरिक्त दायित्व।
  • स्तर 4 – सबसे सख्त स्तर जो पर्यावरणीय हमलों के खिलाफ मजबूत भौतिक सुरक्षा उपायों की आवश्यकता होती है।

उदाहरण के लिए, एक क्रिप्टोग्राफिक मॉड्यूल जो FIPS 140-2 स्तर 1 के लिए मान्य है, उसके माध्यम से जाने वाले डेटा को AES द्वारा प्रदान की गई सुरक्षा के स्तर तक एन्क्रिप्ट करके उस बुनियादी सुरक्षा स्तर को प्रदान करता है। हालांकि, एक क्रिप्टोग्राफिक मॉड्यूल जो FIPS 140-2 स्तर 2 के लिए मान्य है, न केवल AES इलेक्ट्रॉनिक एन्क्रिप्शन प्रदान करता है बल्कि डिवाइस की भौतिक सुरक्षा भी प्रदान करता है।

इसका मतलब है कि एक FIPS 140-2 स्तर 2 मान्य क्रिप्टोग्राफिक मॉड्यूल के साथ छेड़छाड़ नहीं की जा सकती जब तक कि समाधान आवास पर सील न टूटी हो, जिस स्थिति में तथाकथित क्रिप्टोग्राफिक अधिकारी को तुरंत पता चल जाएगा कि सूचना सुरक्षा समझौता हो गई है और वह तुरंत किसी भी डेटा उल्लंघन को ठीक करने के लिए कार्रवाई कर सकती है।

FIPS क्यों महत्वपूर्ण है?

FIPS 140-2 मान्य क्रिप्टोग्राफिक मॉड्यूल कानून द्वारा सभी अमेरिकी फेडरल एजेंसियों के लिए आवश्यक हैं जो संवेदनशील लेकिन अवर्गीकृत जानकारी को संभालते हैं। और अन्य उद्योग क्षेत्र FIPS 140-2 स्तर 2 को अपनी बैकहॉल सुरक्षा के लिए एक अनिवार्य आइटम बना रहे हैं, जिसमें वित्त, स्वास्थ्य सेवा, कानूनी सेवाएं, मोबाइल ऑपरेटर और सार्वजनिक सुरक्षा उद्योग शामिल हैं।

APISIX FIPS 140-2 के अनुरूप

FIPS 140-2 के अनुरूप कैसे हों?

जब FIPS 140-2 मान्य OpenSSL 3.0 के FIPS मोड में संचालित होने वाले बिल्ड के साथ उपयोग किया जाता है, तो APISIX SSL/TLS-एन्क्रिप्टेड नेटवर्क ट्रैफिक के डिक्रिप्शन और एन्क्रिप्शन के संबंध में FIPS 140-2 (स्तर 1) की आवश्यकताओं के अनुरूप है।

प्रभाव

FIPS मोड निम्नलिखित सिफर को अक्षम करता है:

  • TLS_ECDH_anon_WITH_RC4_128_SHA
  • TLS_ECDHE_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  • TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  • TLS_RSA_WITH_IDEA_CBC_SHA
  • TLS_RSA_WITH_RC4_128_MD5
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_SEED_CBC_SHA

और, FIPS 2048 बिट्स से छोटे RSA कुंजी का समर्थन नहीं करता है।

OpenSSL बिल्ड करें

FIPS सक्षम के साथ OpenSSL बिल्ड और इंस्टॉल करें

apt install -y build-essential git clone https://github.com/openssl/openssl cd openssl ./Configure --prefix=/usr/local/openssl-3.0 enable-fips make install bash -c "echo /usr/local/openssl-3.0/lib64 > /etc/ld.so.conf.d/openssl3.conf" ldconfig /usr/local/openssl-3.0/bin/openssl fipsinstall -out /usr/local/openssl-3.0/ssl/fipsmodule.cnf \ -module /usr/local/openssl-3.0/lib64/ossl-modules/fips.so sed_expr='s@# .include fipsmodule.cnf@.include /usr/local/openssl-3.0/ssl/fipsmodule.cnf@g;' sed_expr+=' s/# \(fips = fips_sect\)/\1\nbase = base_sect\n\n[base_sect]\nactivate=1\n/g' sed -i "$sed_expr" /usr/local/openssl-3.0/ssl/openssl.cnf bash -c "echo /usr/local/openssl-3.0/lib64 > /etc/ld.so.conf.d/openssl3.conf" ldconfig

OpenSSL सत्यापित करें

कॉन्फ़िगरेशन फ़ाइल (/usr/local/openssl-3.0/ssl/openssl.cnf) को सत्यापित करें।

सुनिश्चित करें कि यह निम्नलिखित स्निपेट से मेल खाता है:

config_diagnostics = 1 openssl_conf = openssl_init .include /usr/local/ssl/fipsmodule.cnf [openssl_init] providers = provider_sect [provider_sect] fips = fips_sect base = base_sect [base_sect] activate = 1

निर्धारित करें कि OpenSSL SHA1 हैश कर सकता है या नहीं: यह परीक्षण OpenSSL के सही संचालन को सत्यापित करता है। SHA1 हैश एल्गोरिदम सभी मोड में अनुमति प्राप्त है, इसलिए इस कमांड की विफलता इंगित करती है कि OpenSSL कार्यान्वयन सही ढंग से काम नहीं कर रहा है:

# openssl sha1 /dev/null SHA1(/dev/null)= da39a3ee5e6b4b0d3255bfef95601890afd80709

निर्धारित करें कि OpenSSL MD5 हैश कर सकता है या नहीं: यह परीक्षण सत्यापित करता है कि OpenSSL FIPS मोड में चल रहा है। MD5 FIPS मोड में अनुमति प्राप्त हैश एल्गोरिदम नहीं है, इसलिए इसका उपयोग करने का प्रयास विफल होता है:

# openssl md5 /dev/null Error setting digest 80920FA8DA7F0000:error:0308010C:digital envelope routines: inner_evp_generic_fetch:unsupported:crypto/evp/evp_fetch.c:341: Global default library context, Algorithm (MD5 : 100), Properties ()

यदि OpenSSL FIPS मोड में नहीं चल रहा है, तो MD5 हैश सामान्य रूप से कार्य करता है:

# /usr/bin/openssl md5 /dev/null MD5(/dev/null)= d41d8cd98f00b204e9800998ecf8427e

FIPS के साथ APISIX बिल्ड करें

# install pcre and zlib dependencies wget -O - https://openresty.org/package/pubkey.gpg | apt-key add - echo "deb http://openresty.org/package/${arch_path}ubuntu $(lsb_release -sc) main" | \ tee /etc/apt/sources.list.d/openresty.list apt-get update apt-get install -y openresty-pcre-dev openresty-zlib-dev # specify compile and link options export zlib_prefix=/usr/local/openresty/zlib export pcre_prefix=/usr/local/openresty/pcre export cc_opt="-DNGX_LUA_ABORT_AT_PANIC -I${zlib_prefix}/include -I${pcre_prefix}/include" cc_opt+="-I/usr/local/openssl-3.0/include" export ld_opt="-L${zlib_prefix}/lib -L${pcre_prefix}/lib -L/usr/local/openssl-3.0/lib64" ld_opt+="-Wl,-rpath,${zlib_prefix}/lib:${pcre_prefix}/lib:/usr/local/openssl-3.0/lib64" # build and install apisix-base wget https://raw.githubusercontent.com/api7/apisix-build-tools/master/build-apisix-base.sh bash build-apisix-base.sh latest

एक परीक्षण रूट कॉन्फ़िगर करें

curl http://127.0.0.1:9180/apisix/admin/routes/httpbin -H 'X-API-KEY: YOUR-KEY' -X PUT -i -d ' { "uri": "/anything", "hosts": ["*.httpbin.org"], "methods": ["GET"], "upstream": { "type": "roundrobin", "nodes": { "httpbin.org": 1 } } }'

निजी कुंजी सत्यापित करें

सामान्य मामले का परीक्षण करें, हम उम्मीद करते हैं कि यह सफल होगा।

सर्ट अपलोड करने के लिए एक सहायक पायथन स्क्रिप्ट बनाएं:

cfg_ssl.py

import sys import requests if len(sys.argv) <= 3: print("bad argument") sys.exit(1) with open(sys.argv[1]) as f: cert = f.read() with open(sys.argv[2]) as f: key = f.read() sni = sys.argv[3] api_key = "edd1c9f034335f136f87ad84b625c8f1" resp = requests.put("http://127.0.0.1:9180/apisix/admin/ssls/1", json={ "cert": cert, "key": key, "snis": [sni], }, headers={ "X-API-KEY": api_key, }) print(resp.status_code) print(resp.text)

कुंजी जनरेशन को आसान बनाने के लिए एक बैश फ़ंक्शन बनाएं:

genkey() { keylen=${1:-4096} /usr/bin/openssl genrsa -out apisix.key $keylen /usr/bin/openssl req -key apisix.key -new -out apisix.csr -subj '/C=/ST=/L=/O=/OU=web/CN=*.httpbin.org' /usr/bin/openssl x509 -req -in apisix.csr -signkey apisix.key -out apisix.crt -days 3650 -sha256 }

परीक्षण:

cd $(mktemp -d) genkey 2048 python3 ssl.py apisix.crt apisix.key '*.httpbin.org' curl --resolve 'www.httpbin.org:9443:127.0.0.1' https://www.httpbin.org:9443/uuid -vvv -k

आउटपुट:

... * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: OU=web; CN=*.httpbin.org * start date: Dec 22 05:52:58 2022 GMT * expire date: Dec 19 05:52:58 2032 GMT * issuer: OU=web; CN=*.httpbin.org * SSL certificate verify result: self signed certificate (18), continuing anyway. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x55e125a24e30) > GET /uuid HTTP/2 > Host: www.httpbin.org:9443 > user-agent: curl/7.68.0 > accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < content-type: application/json < content-length: 53 < date: Thu, 22 Dec 2022 06:35:04 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < server: APISIX/3.0.0 < { "uuid": "1827f239-376f-47ec-9b54-d5addaa8c7f9" }

2048 बिट्स से छोटी कुंजी का परीक्षण करें

FIPS 2048 बिट्स से छोटे RSA कुंजी का समर्थन नहीं करता है। तो, आइए परीक्षण करें कि क्या यह छोटी कुंजी के साथ विफल होता है।

genkey 1024 python3 cfg_ssl.py apisix.crt apisix.key '*.httpbin.org' curl --resolve 'www.httpbin.org:9443:127.0.0.1' https://www.httpbin.org:9443/uuid -vvv -k

आउटपुट:

... * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS alert, internal error (592): * error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error * Closing connection 0 curl: (35) error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error

निष्कर्ष

FIPS के कठोर परीक्षण को देखते हुए, उन्हें एक विश्वसनीय सुरक्षा मानक माना जाता है। साथ ही, वे किसी भी संस्था के लिए एक उपयोगी आधार हैं जिन्हें अपने बुनियादी ढांचे में सुरक्षा मानकों को लागू करने की आवश्यकता है।

APISIX में FIPS समर्थन जोड़ना आसान है। APISIX का उपयोग SSL/TLS-एन्क्रिप्टेड नेटवर्क ट्रैफिक को डिक्रिप्ट और एन्क्रिप्ट करने के लिए किया जा सकता है जहां FIPS 140-2 स्तर 1 अनुपालन की आवश्यकता होती है।

API गेटवे के बारे में अधिक जानकारी के लिए कृपया हमारे ब्लॉग पर जाएं या हमसे संपर्क करें

Tags: