Erlang 21 - 4. Using TLS for Erlang Distribution

4 एर्लांग वितरण के लिए टीएलएस का उपयोग करना




erlang

4 एर्लांग वितरण के लिए टीएलएस का उपयोग करना

यह खंड बताता है कि एर्लांग वितरण अतिरिक्त सत्यापन और सुरक्षा प्राप्त करने के लिए टीएलएस का उपयोग कैसे कर सकता है।

Erlang वितरण सिद्धांत में लगभग किसी भी कनेक्शन-आधारित प्रोटोकॉल का उपयोग वाहक के रूप में कर सकता है। हालाँकि, एक मॉड्यूल जो कनेक्शन सेटअप के प्रोटोकॉल-विशिष्ट भागों को लागू करता है। डिफ़ॉल्ट वितरण मॉड्यूल कर्नेल अनुप्रयोग में inet_tcp_dist है। वितरित net_kernel नोड को शुरू करते समय, net_kernel इस मॉड्यूल का उपयोग net_kernel पोर्ट और कनेक्शन को सेट करने के लिए करता है।

SSL अनुप्रयोग में, एक अतिरिक्त वितरण मॉड्यूल, inet_tls_dist , विकल्प के रूप में उपयोग किया जा सकता है। सभी वितरण कनेक्शन टीएलएस का उपयोग करेंगे और एक वितरित प्रणाली में सभी भाग लेने वाले एरलांग नोड्स इस वितरण मॉड्यूल का उपयोग करेंगे।

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

टीएलएस पर एरलांग वितरण स्थापित करने के लिए:

  • चरण 1: SSL अनुप्रयोग सहित बूट स्क्रिप्ट बनाएँ।
  • चरण 2: net_kernel लिए वितरण मॉड्यूल निर्दिष्ट करें।
  • चरण 3: सुरक्षा विकल्पों और अन्य एसएसएल विकल्पों को निर्दिष्ट करें।
  • चरण 4: पर्यावरण को हमेशा टीएलएस का उपयोग करने के लिए सेट करें।

निम्न अनुभाग इन चरणों का वर्णन करते हैं।

4.1 SSL अनुप्रयोग सहित बूट बूट लिपियों का निर्माण

systools एप्लिकेशन में systools उपयोगिता का उपयोग करके बूट स्क्रिप्ट बनाई जाती है। systools बारे में अधिक जानकारी के लिए, systools प्रलेखन देखें। यह केवल एक उदाहरण है कि क्या किया जा सकता है।

सबसे आसान बूट स्क्रिप्ट में केवल कर्नेल और STDLIB एप्लिकेशन शामिल हैं। ऐसी स्क्रिप्ट Erlang वितरण की bin निर्देशिका में स्थित है। स्क्रिप्ट का स्रोत releases/<OTP version>/start_clean.rel अंतर्गत Erlang स्थापना शीर्ष निर्देशिका के अंतर्गत पाया जाता है।

निम्न कार्य करें:

  • उस स्क्रिप्ट को किसी अन्य स्थान पर कॉपी करें (और अधिमानतः दूसरा नाम)।

  • STDLIB एप्लिकेशन के बाद अपने वर्तमान संस्करण संख्याओं के साथ Crypto, Public Key और SSL अनुप्रयोगों को जोड़ें।

निम्नलिखित टीएलएस के साथ एक उदाहरण .rel फ़ाइल जोड़ा गया है:

{release, {"OTP  APN 181 01","R15A"}, {erts, "5.9"},
[{kernel,"2.15"},
{stdlib,"1.18"},
{crypto, "2.0.3"},
{public_key, "0.12"},
{asn1, "4.0"},
{ssl, "5.0"}
]}.

संस्करण संख्या आपके सिस्टम में भिन्न होती है। जब भी स्क्रिप्ट में शामिल किसी एक एप्लिकेशन को अपग्रेड किया जाता है, तो स्क्रिप्ट को बदल दें।

निम्न कार्य करें:

  • बूट स्क्रिप्ट बनाएँ।

    .rel file मानकर एक फ़ाइल start_ssl.rel में संग्रहित किया जाता है। वर्तमान निर्देशिका में एक बूट स्क्रिप्ट बनाई जा सकती है:

1> systools:make_script("start_ssl",[]).    

वर्तमान निर्देशिका में अब एक start_ssl.boot फ़ाइल है।

निम्न कार्य करें:

  • बूट स्क्रिप्ट का परीक्षण करें। ऐसा करने के लिए, इस बूट स्क्रिप्ट को निर्दिष्ट करते हुए -boot कमांड-लाइन पैरामीटर के साथ Erlang शुरू करें (इसके पूर्ण पथ के साथ, लेकिन .boot प्रत्यय के बिना)। UNIX में यह इस प्रकार दिख सकता है:

$ erl -boot /home/me/ssl/start_ssl
Erlang (BEAM) emulator version 5.0
 
Eshell V5.0  (abort with ^G)
1> whereis(ssl_manager).
<0.41.0>    

whereis फ़ंक्शन-कॉल सत्यापित करता है कि एसएसएल अनुप्रयोग शुरू हो गया है।

बूटस्क्रिप्ट बनाने के विकल्प के रूप में, आप स्पष्ट रूप से कमांड लाइन पर SSL ebin डायरेक्टरी में पथ जोड़ सकते हैं। यह कमांड-लाइन विकल्प -pa साथ किया जाता है। यह काम करता है क्योंकि वितरण के लिए एसएसएल एप्लिकेशन को शुरू करने की आवश्यकता नहीं है, क्योंकि एसएसएल एप्लिकेशन का एक क्लोन कर्नेल एप्लिकेशन में झुका हुआ है। इसलिए, जब तक एसएसएल एप्लिकेशन कोड तक पहुंचा जा सकता है, वितरण शुरू हो जाता है। -pa विधि केवल परीक्षण प्रयोजनों के लिए अनुशंसित है।

ध्यान दें

एसएसएल एप्लिकेशन के क्लोन को एसएसबी कोड के उपयोग को वितरण शुरू करने के लिए आवश्यक शुरुआती बूटस्टेज में सक्षम करना चाहिए। हालाँकि, इससे SSL एप्लिकेशन को सॉफ्ट अपग्रेड करना असंभव हो जाता है।

4.2 net_kernel के लिए वितरण मॉड्यूल निर्दिष्ट करना

एसएसएल / टीएलएस के लिए वितरण मॉड्यूल को inet_tls_dist नाम दिया inet_tls_dist और विकल्प -proto_dist साथ कमांड लाइन पर निर्दिष्ट किया गया है। -proto_dist का तर्क प्रत्यय _dist बिना मॉड्यूल नाम _dist । तो, यह वितरण मॉड्यूल कमांड लाइन पर -proto_dist inet_tls साथ निर्दिष्ट है।

कमांड लाइन का विस्तार निम्नलिखित देता है:

$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls    

वितरण शुरू करने के लिए, एमुलेटर को एक नाम दें:

$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]
 
Eshell V5.0  (abort with ^G)
([email protected])1>     

हालांकि, इस तरह से शुरू किया गया एक नोड अन्य नोड्स से बात करने से इनकार करता है, क्योंकि कोई टीएलएस पैरामीटर की आपूर्ति नहीं की जाती है (अगला भाग देखें)।

4.3 SSL / TLS विकल्प निर्दिष्ट करना

एसएसएल / टीएलएस वितरण विकल्पों को एक फ़ाइल में लिखा जा सकता है जिसे नोड शुरू होने पर परामर्श दिया जाता है। यह फ़ाइल नाम तब कमांड लाइन तर्क -ssl_dist_optfile साथ निर्दिष्ट होता है।

किसी भी उपलब्ध एसएसएल / टीएलएस विकल्प को विकल्प फ़ाइल में निर्दिष्ट किया जा सकता है, लेकिन ध्यान दें कि विकल्प जो fun() लेते fun() में सिंटैक्स fun Mod:Func/Arity का उपयोग करना है fun Mod:Func/Arity चूंकि किसी फंक्शन बॉडी को किसी फाइल की सलाह देते समय संकलित नहीं किया जा सकता।

सॉकेट विकल्प list साथ छेड़छाड़ न करें, binary , active , packet , nodelay और deliver क्योंकि वे वितरण प्रोटोकॉल हैंडलर द्वारा उपयोग किए जाते हैं। अन्य कच्चे सॉकेट विकल्प जैसे कि packet_size गंभीर रूप से हस्तक्षेप कर सकते हैं, इसलिए सावधान रहें!

एसएसएल / टीएलएस काम करने के लिए, सर्वर साइड के लिए कम से कम एक सार्वजनिक कुंजी और एक प्रमाण पत्र निर्दिष्ट होना चाहिए। निम्नलिखित उदाहरण में, PEM फ़ाइल "/home/me/ssl/erlserver.pem" में सर्वर प्रमाणपत्र और इसकी निजी कुंजी दोनों शामिल हैं।

उदाहरण के लिए एक फ़ाइल बनाएं जिसका नाम "/home/me/ssl/[email protected]" :

[{server,
  [{certfile, "/home/me/ssl/erlserver.pem"},
   {secure_renegotiate, true}]},
 {client,
  [{secure_renegotiate, true}]}].

और फिर इस तरह नोड शुरू करें (कमांड में लाइन ब्रेक पठनीयता के लिए हैं, और टाइप किए जाने पर वहां नहीं होंगे):

$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
  -ssl_dist_optfile "/home/me/ssl/[email protected]"
  -sname ssl_test

ssl:ssl_accept/3 , और {client, Opts} tuple में विकल्पों का उपयोग ssl:connect/4 कॉल ssl:connect/4 करते समय विकल्प {server, Opts} ssl:ssl_accept/3 में किया जाता है।

क्लाइंट के लिए {server_name_indication, atom_to_list(TargetNode)} करते समय {server_name_indication, atom_to_list(TargetNode)} विकल्प जोड़ा जाता है। इससे क्लाइंट विकल्प {verify, verify_peer} का उपयोग करना संभव हो जाता है, और क्लाइंट यह सत्यापित करेगा कि आपके द्वारा कनेक्ट किए जा रहे नोड नाम से प्रमाणपत्र मेल खाता है। यह केवल तभी काम करता है जब सर्वर सर्टिफिकेट atom_to_list(TargetNode) नाम से जारी किया जाता है।

सर्वर के लिए विकल्प {verify, verify_peer} का उपयोग करना भी संभव है और सर्वर केवल क्लाइंट सर्टिफिकेट्स के साथ उन सर्टिफिकेट्स को स्वीकार करेगा जो रूट सर्टिफिकेट के {verify, verify_peer} होते हैं, जिसे सर्वर जानता है। एक ग्राहक जो एक अविश्वसनीय प्रमाण पत्र प्रस्तुत करता है उसे अस्वीकार कर दिया जाएगा। यह विकल्प अधिमानतः {fail_if_no_peer_cert, true} के साथ संयुक्त है या कोई क्लाइंट अभी भी स्वीकार किया जाएगा यदि वह कोई प्रमाण पत्र प्रस्तुत नहीं करता है।

वितरण प्रोटोकॉल के रूप में टीएलएस का उपयोग करके इस तरह से शुरू किया गया एक नोड पूरी तरह कार्यात्मक है।

4.4 SSL / TLS विकल्प निर्दिष्ट करना (विरासत)

पिछले खंड की तरह PEM फ़ाइल "/home/me/ssl/erlserver.pem" में सर्वर प्रमाणपत्र और इसकी निजी कुंजी दोनों शामिल हैं।

erl कमांड लाइन पर आप उन विकल्पों को निर्दिष्ट कर सकते हैं जो SSL / TLS वितरण सॉकेट बनाते समय जोड़ता है।

निम्न सूची में सबसे सरल एसएसएल / टीएलएस विकल्प उपसर्ग client_ या client_ को विकल्प नाम में जोड़कर निर्दिष्ट किया जा सकता है:

  • certfile
  • keyfile
  • password
  • cacertfile
  • verify
  • verify_fun ( {Module, Function, InitialUserState} रूप में लिखें)
  • crl_check
  • crl_cache (Erlang शब्द के रूप में लिखें)
  • reuse_sessions
  • secure_renegotiate
  • depth
  • hibernate_after
  • ciphers (पुराने स्ट्रिंग प्रारूप का उपयोग करें)

नोट करें कि verify_fun को इसी SSL / TLS विकल्प की तुलना में भिन्न रूप में verify_fun आवश्यकता है, क्योंकि कमांड लाइन पर verify_fun स्वीकार नहीं किया जाता है।

सर्वर विकल्प dhfile और fail_if_no_peer_cert (भी उपसर्ग) भी ले सकता है।

जब वितरण किसी अन्य नोड के लिए कनेक्शन आरंभ करता है, तो client_ -प्रमाणित विकल्पों का उपयोग किया जाता है। एक दूरस्थ नोड से एक कनेक्शन को स्वीकार करते समय सर्वर_-उपसर्ग विकल्प का उपयोग किया जाता है।

packet और size जैसे कच्चे सॉकेट विकल्प को कमांड लाइन पर निर्दिष्ट नहीं किया जाना चाहिए।

एसएसएल / टीएलएस विकल्पों को निर्दिष्ट करने के लिए कमांड-लाइन तर्क को -ssl_dist_opt नाम दिया -ssl_dist_opt और एसएसएल विकल्प और उनके मूल्यों के जोड़े का पालन किया जाना है। तर्क -ssl_dist_opt को किसी भी समय दोहराया जा सकता है।

एक उदाहरण कमांड लाइन जो पिछले अनुभाग में उदाहरण के समान है, अब निम्नानुसार देख सकता है (कमांड में लाइन ब्रेक पठनीयता के लिए हैं, और टाइप किए जाने पर वहां नहीं होगा):

$ erl -boot /home/me/ssl/start_ssl -proto_dist inet_tls
  -ssl_dist_opt server_certfile "/home/me/ssl/erlserver.pem"
  -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true
  -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]

Eshell V5.0  (abort with ^G)
([email protected])1>

4.5 हमेशा एसएसएल / टीएलएस (लिगेसी) का उपयोग करने के लिए पर्यावरण की स्थापना

ERL_FLAGS तर्कों को निर्दिष्ट करने का एक सुविधाजनक तरीका पर्यावरण चर ERL_FLAGS का उपयोग करना है। एसएसएल / टीएलएस वितरण का उपयोग करने के लिए आवश्यक सभी झंडे उस चर में निर्दिष्ट किए जा सकते हैं और फिर एर्लांग के सभी बाद के आक्रमणों के लिए कमांड-लाइन तर्क के रूप में व्याख्या की जाती है।

एक यूनिक्स (बॉर्न) शेल में, यह निम्न प्रकार से देख सकता है (लाइन ब्रेक पठनीयता के लिए हैं, टाइप करने पर वे वहां नहीं होते हैं):

$ ERL_FLAGS="-boot /home/me/ssl/start_ssl -proto_dist inet_tls
  -ssl_dist_opt server_certfile /home/me/ssl/erlserver.pem
  -ssl_dist_opt server_secure_renegotiate true client_secure_renegotiate true"
$ export ERL_FLAGS
$ erl -sname ssl_test
Erlang (BEAM) emulator version 5.0 [source]
 
Eshell V5.0  (abort with ^G)
([email protected])1> init:get_arguments().
[{root,["/usr/local/erlang"]},
 {progname,["erl "]},
 {sname,["ssl_test"]},
 {boot,["/home/me/ssl/start_ssl"]},
 {proto_dist,["inet_tls"]},
 {ssl_dist_opt,["server_certfile","/home/me/ssl/erlserver.pem"]},
 {ssl_dist_opt,["server_secure_renegotiate","true",
                "client_secure_renegotiate","true"]
 {home,["/home/me"]}]    

init:get_arguments() कॉल सत्यापित करता है कि एमुलेटर को सही तर्क दिए गए हैं।

4.6 IPv6 पर SSL / TLS वितरण का उपयोग करना

आईपीवी 4 के बजाय आईपीवी 6 पर एसएसएल / टीएलएस वितरण का उपयोग करना संभव है। ऐसा करने के लिए, Erlang शुरू करने पर या तो कमांड लाइन पर या ERL_FLAGS पर्यावरण चर में, ERL_FLAGS -proto_dist inet6_tls बजाय विकल्प -proto_dist inet6_tls पास करें।

इस विकल्प के साथ एक उदाहरण कमांड लाइन इस तरह दिखाई देगी:

$ erl -boot /home/me/ssl/start_ssl -proto_dist inet6_tls
  -ssl_dist_optfile "/home/me/ssl/[email protected]"
  -sname ssl_test

इस तरह से शुरू किया गया नोड केवल IPv6 पर SSL / TLS वितरण का उपयोग करके अन्य नोड्स के साथ संवाद करने में सक्षम होगा।