HTTPS और रिवर्स प्रॉक्सी
नया इंस्टॉलेशन सादे HTTP पर 127.0.0.1:8080 पर सुनता है। केवल सर्वर पर मौजूद प्रोग्राम ही उस तक पहुँच सकते हैं। दूसरे कंप्यूटरों से क्लाइंट जुड़ने से पहले, उसके सामने HTTPS रखें। कुंजियाँ, पासवर्ड और डाउनलोड लिंक अनुरोधों में यात्रा करते हैं: उन्हें कंप्यूटरों के बीच कभी सादे HTTP पर न भेजें।
तरीका चुनें
| अंतर्निहित TLS | रिवर्स प्रॉक्सी | |
|---|---|---|
| इंस्टॉलेशन | Windows सेवाएँ और Linux (नेटिव)। Compose नहीं | सभी, और Compose के लिए एकमात्र तरीका |
| सेटअप | रोलबैक के साथ एक arkvory configure कमांड | प्रॉक्सी विन्यास, और Arkvory में ARKVORY_TRUSTED_PROXIES |
| पोर्ट | API पोर्ट, डिफ़ॉल्ट रूप से 8080 | कोई भी, जैसे 443 |
| प्रमाणपत्र नवीनीकरण | API नवीनीकृत फ़ाइलें स्वयं पढ़ता है | प्रॉक्सी द्वारा संभाला जाता है |
| क्लाइंट प्रमाणपत्र (mTLS) | समर्थित नहीं | प्रॉक्सी में संभव |
शुरू करने से पहले
- उस नाम के लिए प्रमाणपत्र लें जो क्लाइंट इस्तेमाल करते हैं, किसी ऐसे प्राधिकरण से जिस पर क्लाइंट भरोसा करते हैं, उदाहरण के लिए certbot, win-acme या आपके कॉर्पोरेट प्राधिकरण के साथ। आपको उसकी चेन के साथ प्रमाणपत्र और निजी कुंजी चाहिए, दोनों PEM फ़ाइलों के रूप में। कुंजी पर कोई पासवर्ड नहीं होना चाहिए।
- एक DNS नाम बनाएँ जो सर्वर की ओर इशारा करे।
- फ़ायरवॉल में केवल HTTPS पोर्ट खोलें, और केवल अपने क्लाइंट के नेटवर्क के लिए। डेटाबेस पोर्ट (54329 या 45329-45348) कभी न खोलें।
अंतर्निहित TLS
फ़ाइलें तैयार करें
फ़ाइलों को इन नियमों को पूरा करना चाहिए। कमांड कुछ भी बदलने से पहले उन सभी की जाँच करता है।
- पथ निरपेक्ष हैं।
- हर फ़ाइल अधिकतम 1 MiB की PEM फ़ाइल है। प्रमाणपत्र फ़ाइल में प्रमाणपत्र और उसके बाद चेन रहती है।
- कुंजी एक अनएन्क्रिप्टेड PEM निजी कुंजी है जो प्रमाणपत्र से मेल खाती है।
- प्रमाणपत्र समाप्त नहीं हुआ है।
- सेवा खाता दोनों फ़ाइलें पढ़ सकता है: Linux पर
arkvory, Windows परLocalService।
Arkvory फ़ाइलों का संदर्भ देता है और उन्हें कॉपी नहीं करता। उन्हें वहाँ रखें जहाँ नवीनीकरण करने पर वे रहें। Linux पर, /home के अंतर्गत नहीं: यूनिट्स उसे नहीं देख सकतीं। कुछ प्रमाणपत्र टूल की डायरेक्टरियाँ केवल root पढ़ सकता है; नवीनीकृत फ़ाइलों को ऐसी डायरेक्टरी में कॉपी करें जिसे सेवा समूह पढ़ सके, उदाहरण के लिए नवीनीकरण हुक के साथ। Linux के लिए उदाहरण:
sudo install -d -m 0750 -o root -g arkvory /etc/arkvory/tls
sudo install -m 0644 -o root -g arkvory fullchain.pem /etc/arkvory/tls/fullchain.pem
sudo install -m 0640 -o root -g arkvory privkey.pem /etc/arkvory/tls/privkey.pemWindows पर, फ़ाइलों को ऐसे फ़ोल्डर में रखें जिसे LocalService पढ़ सके, और कुंजी को केवल SYSTEM, Administrators और LocalService पढ़ने दें।
अंतर्निहित TLS चालू करें
कमांड को पथों और उस पते के साथ चलाएँ जिस पर सुनना है।
0.0.0.0सभी IPv4 इंटरफ़ेस पर सुनता है,::सभी इंटरफ़ेस पर, या किसी एक इंटरफ़ेस का पता दें।bashsudo arkvory configure --root /opt/proanima-arkvory \ --tls-cert /etc/arkvory/tls/fullchain.pem \ --tls-key /etc/arkvory/tls/privkey.pem \ --listen-host 0.0.0.0powershell& 'C:\Program Files\ProAnima\Arkvory\arkvory.ps1' configure --root C:\ProgramData\ProAnima\Arkvory ` --tls-cert C:\ProgramData\ProAnima\Arkvory\tls\fullchain.pem ` --tls-key C:\ProgramData\ProAnima\Arkvory\tls\privkey.pem ` --listen-host 0.0.0.0कमांड
config/runtime.jsonमेंARKVORY_TLS_CERT_FILE,ARKVORY_TLS_KEY_FILEऔरARKVORY_HOSTलिखता है, सेवाएँ रीस्टार्ट करता है और प्रतीक्षा करता है जब तक API HTTPS पर अपनी रेडीनेस जाँच का उत्तर न दे। जाँच केवल कॉन्फ़िगर किया गया प्रमाणपत्र स्वीकार करती है। सफल होने पर, कमांड वह दिन छापता है जिस दिन प्रमाणपत्र समाप्त होता है। कुछ भी विफल होने पर, यह पिछलाruntime.jsonबहाल करता है, उसी के साथ सेवाएँ रीस्टार्ट करता है और कारण बताता है।अपने क्लाइंट नेटवर्क के लिए फ़ायरवॉल में API पोर्ट खोलें।
किसी क्लाइंट कंप्यूटर से जाँचें। जब तक आप
ARKVORY_PORTन बदलें, पोर्ट 8080 ही रहता है:bashcurl https://arkvory.example.com:8080/health/statusउत्तर स्टेटस 200 के साथ
{"status":"ready"}है। कंसोलhttps://arkvory.example.com:8080/console/पर है।
Linux पर सेवा खाता सामान्यतः 1024 से नीचे के पोर्ट पर नहीं सुन सकता। पोर्ट 443 पर HTTPS परोसने के लिए, रिवर्स प्रॉक्सी इस्तेमाल करें।
यदि शुरू होते समय प्रमाणपत्र अमान्य हो, तो API त्रुटि के साथ रुक जाता है। यह कभी सादे HTTP पर वापस नहीं जाता।
सेटिंग्स
configure फ़ाइलें और पता सेट करता है। दो और सेटिंग्स runtime.json में हाथ से जाती हैं। उन्हें बदलने के बाद सेवाएँ रीस्टार्ट करें: बदलाव लागू करें देखें।
| वेरिएबल | डिफ़ॉल्ट | अर्थ |
|---|---|---|
ARKVORY_TLS_MIN_VERSION | TLSv1.2 | TLSv1.2 या TLSv1.3 |
ARKVORY_TLS_RELOAD_SECONDS | 300 | API कितनी बार प्रमाणपत्र फ़ाइलें फिर से पढ़ता है: 30 से 86400 सेकंड, या 0 केवल शुरू होते समय पढ़ने के लिए |
हर उत्तर में Strict-Transport-Security: max-age=31536000 होता है।
प्रमाणपत्र नवीनीकृत करें
नवीनीकृत प्रमाणपत्र और कुंजी को उन्हीं पथों पर लिखें। आपको कोई कमांड और कोई रीस्टार्ट नहीं चाहिए।
- API हर
ARKVORY_TLS_RELOAD_SECONDSपर फ़ाइलों की तुलना करता है। नए कनेक्शन नया प्रमाणपत्र इस्तेमाल करते हैं। खुले कनेक्शन समाप्त होने तक पुराना रखते हैं। - टूटा हुआ नवीनीकरण (अपठनीय फ़ाइलें, न मेल खाती कुंजी, समाप्त प्रमाणपत्र) काम कर रहे प्रमाणपत्र को कभी नहीं बदलता। API
tls.reload_failedलॉग करता है और अगले अंतराल पर फिर प्रयास करता है। - समाप्ति से पहले के अंतिम 14 दिनों में, API दिन में एक बार
tls.expiringलॉग करता है। मीट्रिकarkvory_tls_certificate_expiry_timestamp_secondsअलर्ट के लिए उपयुक्त है। मॉनिटरिंग देखें।
अंतर्निहित TLS बंद करें
sudo arkvory configure --root /opt/proanima-arkvory --tls-off --listen-host 127.0.0.1--tls-off अकेले सुनने का पता वैसा ही छोड़ देता है। --listen-host 127.0.0.1 के बिना, API तब हर उस इंटरफ़ेस पर सादा HTTP परोसेगा जिसे आपने खोला था।
रिवर्स प्रॉक्सी
प्रॉक्सी क्लाइंट से HTTPS स्वीकार करता है और API को सादा HTTP अग्रेषित करता है। API को 127.0.0.1:8080 पर रखें और प्रॉक्सी उसी होस्ट पर इंस्टॉल करें। Compose इंस्टॉलेशन हमेशा केवल 127.0.0.1:8080 प्रकाशित करता है, इसलिए होस्ट पर प्रॉक्सी उसके लिए सीधे फिट बैठता है।
- प्रॉक्सी इंस्टॉल करें और उसके लिए प्रमाणपत्र लें।
- प्रॉक्सी को प्रॉक्सी को क्या करना चाहिए में वर्णित अनुसार कॉन्फ़िगर करें।
- प्रॉक्सी का पता
ARKVORY_TRUSTED_PROXIESमें जोड़ें। भरोसेमंद प्रॉक्सी देखें। - सुनिश्चित करें कि API पोर्ट दूसरे कंप्यूटरों से पहुँच योग्य न हो।
- जाँचें:
curl https://arkvory.example.com/health/status{"status":"ready"}लौटाता है।
प्रॉक्सी को क्या करना चाहिए
| आवश्यकता | क्यों |
|---|---|
किसी भी आकार का अनुरोध बॉडी स्वीकार करें (nginx में client_max_body_size 0) | फ़ाइलें दसियों गीगाबाइट या अधिक होती हैं। एक भाग 1 GiB तक का हो सकता है |
अनुरोध या उत्तर बॉडी बफ़र न करें (proxy_request_buffering off, proxy_buffering off) | बाइट स्ट्रीम होकर गुज़रते हैं। बफ़रिंग प्रॉक्सी की डिस्क भर देती है और ट्रांसफ़र विलंबित करती है |
कम से कम 1900 सेकंड के अनुरोध अनुमत करें (proxy_read_timeout, proxy_send_timeout) | एक अपलोड अनुरोध में 30 मिनट तक लग सकते हैं (ARKVORY_UPLOAD_DEADLINE_MS, डिफ़ॉल्ट रूप से 1 800 000 ms) |
| API से HTTP/1.1 बोलें और कनेक्शन बनाए रखें | स्ट्रीमिंग के लिए ज़रूरी |
Host में सार्वजनिक नाम अग्रेषित करें | सर्वर उससे निरपेक्ष लिंक बनाता है, जैसे Git LFS और npm उत्तरों के लिंक |
X-Forwarded-For और X-Forwarded-Proto: https भेजें | लॉग और साइन-इन सीमा के लिए क्लाइंट पता, और निरपेक्ष लिंक की योजना |
X-Request-Id को अपने ID से अधिलेखित करें | API भरोसेमंद प्रॉक्सी से ID रखता है। क्लाइंट इसे नहीं चुन सकता |
| क्वेरी स्ट्रिंग को अपने एक्सेस लॉग में न लिखें | डाउनलोड लिंक ?token= में एक सीक्रेट रखते हैं |
यदि आप चाहें तो Strict-Transport-Security स्वयं सेट करें | API इसे केवल अंतर्निहित लिसनर से भेजता है |
nginx
इसे किसी मौजूदा nginx के http संदर्भ में रखें। नाम और प्रमाणपत्र पथ बदलें। log_format पथ को बिना क्वेरी स्ट्रिंग के लिखता है।
log_format arkvory_path '$remote_addr [$time_local] "$request_method $uri $server_protocol" '
'$status $body_bytes_sent $request_time $request_id';
server {
listen 443 ssl;
server_name arkvory.example.com;
ssl_certificate /etc/arkvory/tls/fullchain.pem;
ssl_certificate_key /etc/arkvory/tls/privkey.pem;
access_log /var/log/nginx/arkvory.access.log arkvory_path;
client_max_body_size 0;
client_body_timeout 60s;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Request-Id $request_id;
proxy_set_header Connection "";
proxy_request_buffering off;
proxy_buffering off;
proxy_read_timeout 1900s;
proxy_send_timeout 1900s;
}
}इस विन्यास के साथ, प्रॉक्सी को ARKVORY_TRUSTED_PROXIES में सूचीबद्ध करें, उदाहरण के लिए 127.0.0.1। निर्देश proxy_set_header X-Request-Id $request_id रहना चाहिए: यह क्लाइंट के भेजे जा सकने वाले ID को अधिलेखित करता है।
Caddy
arkvory.example.com {
reverse_proxy 127.0.0.1:8080 {
header_up X-Request-Id {http.request.uuid}
flush_interval -1
}
}Caddy प्रमाणपत्र स्वयं लेता है, अनुरोध बॉडी स्ट्रीम करता है, डिफ़ॉल्ट रूप से कोई बॉडी आकार सीमा और कोई अपस्ट्रीम टाइमआउट नहीं रखता, और X-Forwarded-For, X-Forwarded-Proto तथा X-Forwarded-Host सेट करता है। जब तक आप log चालू न करें, Caddy कोई एक्सेस लॉग नहीं लिखता। यदि आप चालू करें, तो लॉग किए गए पते से क्वेरी स्ट्रिंग हटाएँ।
IIS और अन्य प्रॉक्सी
प्रोजेक्ट का संदर्भ विन्यास ऊपर दी गई nginx फ़ाइल है। ये Application Request Routing और URL Rewrite वाले IIS के लिए समतुल्य सेटिंग्स हैं। प्रोजेक्ट उनकी जाँच नहीं करता। नामों को अपने IIS संस्करण से मिलाएँ।
- सर्वर प्रॉक्सी का टाइमआउट कम से कम 1900 सेकंड तक बढ़ाएँ, और रिस्पॉन्स बफ़र थ्रेशोल्ड
0सेट करें। - अनुरोध फ़िल्टरिंग में
maxAllowedContentLengthको उसके अधिकतम, 4 294 967 295 बाइट तक बढ़ाएँ। IIS 4 GiB या अधिक का अनुरोध बॉडी स्वीकार नहीं कर सकता, इसलिए ऐसी फ़ाइल का एकलcurl -Tअपलोड विफल होता है।arkvoryctlबड़ी फ़ाइलें भागों में भेजता है। - मूल होस्ट,
X-Forwarded-Proto: httpsऔर क्लाइंट पताX-Forwarded-Forमें भेजें। URL Rewrite नियम में नयाX-Request-Idसेट करें। - क्वेरी स्ट्रिंग को IIS लॉग से बाहर रखें।
भरोसेमंद प्रॉक्सी
ARKVORY_TRUSTED_PROXIES कॉमा से अलग किए गए, अधिकतम 32 पते या CIDR श्रेणियाँ लेता है। होस्टनाम और वाइल्डकार्ड अस्वीकार कर दिए जाते हैं। केवल इन पतों में से किसी एक से आया अनुरोध ही यह सेट कर सकता है:
- क्लाइंट पता,
X-Forwarded-Forके साथ। API निकटतम ऐसा पता लेता है जो भरोसेमंद नहीं है, - अनुरोध ID,
X-Request-Idके साथ, - निरपेक्ष लिंक का होस्ट,
X-Forwarded-Hostके साथ।
सूची के बिना, हर क्लाइंट प्रॉक्सी के पते से आता दिखता है। तब साइन-इन सीमा सभी लोगों को एक क्लाइंट गिनती है, और एक्सेस लॉग clientIp में प्रॉक्सी का पता दिखाता है। केवल उन्हीं प्रॉक्सी को सूचीबद्ध करें जिन्हें आप नियंत्रित करते हैं।
Compose होस्ट पर, API प्रॉक्सी को Compose नेटवर्क गेटवे के पते के अंतर्गत देख सकता है, 127.0.0.1 के अंतर्गत नहीं। प्रॉक्सी से एक अनुरोध भेजें, API लॉग में http.access रिकॉर्ड में clientIp खोजें, और उस पते को सूचीबद्ध करें।
config/runtime.json संपादित करें और सेवाएँ रीस्टार्ट करें। बदलाव लागू करें देखें।
{ "ARKVORY_TRUSTED_PROXIES": "127.0.0.1,::1" }जब API बिना TLS और बिना भरोसेमंद प्रॉक्सी के नॉन-लूपबैक पते पर सुनता है, तो शुरू होते समय http.plaintext_exposed लॉग करता है। सही प्रॉक्सी सेटअप इसे ट्रिगर नहीं करता।
कंसोल और उसका API पता
Arkvory जो कंसोल परोसता है वह उसी पते का इस्तेमाल करता है जहाँ से वह खोला गया था। यह केवल अपने ही सर्वर से बात करता है: उसकी कंटेंट सुरक्षा नीति कोई दूसरा पता अनुमत नहीं करती। प्रॉक्सी के पीछे यह https://arkvory.example.com/console/ पर अपरिवर्तित काम करता है।
कंसोल को किसी दूसरे वेब सर्वर पर होस्ट करने के लिए, उदाहरण के लिए किसी पोर्टल के साथ:
इंस्टॉलेशन रूट में
releases/<version>/apps/web/public/से कंसोल फ़ाइलें दूसरे सर्वर पर कॉपी करें। उन्हें पथ/console/पर, HTTPS के साथ,.jsऔर.cssके लिए सही MIME प्रकारों के साथ परोसें। हर Arkvory अपडेट के बाद उन्हें फिर से कॉपी करें।कॉपी की गई
index.htmlमें, Arkvory का पता सेट करें:html<meta name="arkvory-api-base-url" content="https://arkvory.example.com/" />यदि दूसरा सर्वर कंटेंट सुरक्षा नीति सेट करता है, तो
connect-srcको Arkvory पते की अनुमति दें और स्थानीय स्क्रिप्ट वर्कर की अनुमति दें।Arkvory में कंसोल के ओरिजिन की अनुमति दें। CORS देखें।
CORS
ARKVORY_CORS_ORIGINS में दूसरे पतों पर चलने वाले वेब एप्लिकेशन के ओरिजिन सेट करें और API रीस्टार्ट करें।
{ "ARKVORY_CORS_ORIGINS": "https://portal.example.com,https://tools.example.com" }- सूची में अधिकतम 16 ओरिजिन होते हैं, हर एक में एक योजना, एक होस्ट और वैकल्पिक पोर्ट होता है, और कोई पथ नहीं। HTTPS आवश्यक है। सादा HTTP केवल
localhost,127.0.0.1और[::1]के लिए स्वीकार्य है। - CORS
/api/v1/*और/health/readyपर लागू होता है। सूचीबद्ध न किए गए ओरिजिन से अनुरोध को कारणorigin_not_allowedके साथ स्टेटस 403 मिलता है। सर्वर के अपने पते से अनुरोध को कोई प्रविष्टि नहीं चाहिए। - सूची में ओरिजिन को कोई अधिकार नहीं मिलता। हर अनुरोध को अभी भी कुंजी या सत्र चाहिए और वह सर्वर की एक्सेस जाँचों से गुज़रता है। वेब एप्लिकेशन कुंजी
Authorizationहेडर में भेजता है, कुकी में नहीं। - अनुमत मेथड GET, HEAD, POST, PUT, PATCH और DELETE हैं। ब्राउज़र प्रीफ़्लाइट अनुरोध का उत्तर 10 मिनट तक कैश कर सकते हैं।
प्रीफ़्लाइट अनुरोध जाँचें। उत्तर स्टेटस 204 के साथ Access-Control-Allow-Origin में आपके ओरिजिन वाला होना चाहिए:
curl -i -X OPTIONS https://arkvory.example.com/api/v1/auth/me \
-H 'Origin: https://portal.example.com' \
-H 'Access-Control-Request-Method: GET' \
-H 'Access-Control-Request-Headers: authorization'सेटअप जाँचें
curl https://arkvory.example.com/health/statusस्टेटस 200 और{"status":"ready"}लौटाता है। प्रमाणपत्र चेन बिना अपवादों के सत्यापित होती है।- कंसोल खोलें, साइन इन करें और उसी पते से एक बड़ी फ़ाइल अपलोड करें।
- HTTPS पते का उपयोग करने वाली प्रोफ़ाइल के साथ
arkvoryctl doctorचलाएँ। क्लाइंट पर प्रमाणपत्र जाँच बंद न करें: कमांड-लाइन क्लाइंट ऐसा नहीं कर सकता, और यह सादा HTTP केवल स्थानीय कंप्यूटर के लिए स्वीकार करता है। कमांड-लाइन क्लाइंट देखें। - API के रीस्टार्ट के बाद, लॉग में
http.plaintext_exposedरिकॉर्ड नहीं है।
समस्या निवारण
| समस्या | कारण और समाधान |
|---|---|
HTTPS was not enabled; the previous configuration is restored | कारण संदेश में आगे आता है: फ़ाइलें PEM नहीं हैं, कुंजी पर पासवर्ड है, कुंजी मेल नहीं खाती, प्रमाणपत्र समाप्त हो गया, या सेवा खाता कोई फ़ाइल नहीं पढ़ सकता। इसे ठीक करें और कमांड फिर चलाएँ |
TLS files must be given as absolute paths | पूरे पथ दें |
Built-in TLS is for native installations; use a reverse proxy with Compose | Compose में अंतर्निहित TLS नहीं है। रिवर्स प्रॉक्सी इस्तेमाल करें |
| प्रॉक्सी से स्टेटस 413 | बॉडी सीमा बहुत कम है। nginx में client_max_body_size 0 इस्तेमाल करें |
| स्टेटस 502 या 504, या मिनटों बाद टूटा हुआ अपलोड | प्रॉक्सी बॉडी बफ़र करता है, या उसके टाइमआउट 1900 सेकंड से कम हैं |
साइन-इन पर सभी सीमित हैं, या clientIp हमेशा प्रॉक्सी है | प्रॉक्सी ARKVORY_TRUSTED_PROXIES में नहीं है |
Git LFS या npm उत्तरों में लिंक http या कोई आंतरिक नाम दिखाते हैं | प्रॉक्सी Host या X-Forwarded-Proto: https अग्रेषित नहीं करता |
ब्राउज़र एप्लिकेशन को 403 origin_not_allowed मिलता है | उसका ओरिजिन ARKVORY_CORS_ORIGINS में जोड़ें और रीस्टार्ट करें |
और संकेत समस्या निवारण और सुरक्षा में हैं।