सामग्री पर जाएँ

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 के लिए उदाहरण:

bash
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.pem

Windows पर, फ़ाइलों को ऐसे फ़ोल्डर में रखें जिसे LocalService पढ़ सके, और कुंजी को केवल SYSTEM, Administrators और LocalService पढ़ने दें।

अंतर्निहित TLS चालू करें ​

  1. कमांड को पथों और उस पते के साथ चलाएँ जिस पर सुनना है। 0.0.0.0 सभी IPv4 इंटरफ़ेस पर सुनता है, :: सभी इंटरफ़ेस पर, या किसी एक इंटरफ़ेस का पता दें।

    bash
    sudo 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.0
    powershell
    & '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 बहाल करता है, उसी के साथ सेवाएँ रीस्टार्ट करता है और कारण बताता है।

  2. अपने क्लाइंट नेटवर्क के लिए फ़ायरवॉल में API पोर्ट खोलें।

  3. किसी क्लाइंट कंप्यूटर से जाँचें। जब तक आप ARKVORY_PORT न बदलें, पोर्ट 8080 ही रहता है:

    bash
    curl 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_VERSIONTLSv1.2TLSv1.2 या TLSv1.3
ARKVORY_TLS_RELOAD_SECONDS300API कितनी बार प्रमाणपत्र फ़ाइलें फिर से पढ़ता है: 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 बंद करें ​

bash
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 प्रकाशित करता है, इसलिए होस्ट पर प्रॉक्सी उसके लिए सीधे फिट बैठता है।

  1. प्रॉक्सी इंस्टॉल करें और उसके लिए प्रमाणपत्र लें।
  2. प्रॉक्सी को प्रॉक्सी को क्या करना चाहिए में वर्णित अनुसार कॉन्फ़िगर करें।
  3. प्रॉक्सी का पता ARKVORY_TRUSTED_PROXIES में जोड़ें। भरोसेमंद प्रॉक्सी देखें।
  4. सुनिश्चित करें कि API पोर्ट दूसरे कंप्यूटरों से पहुँच योग्य न हो।
  5. जाँचें: 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 पथ को बिना क्वेरी स्ट्रिंग के लिखता है।

nginx
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 ​

caddyfile
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 संपादित करें और सेवाएँ रीस्टार्ट करें। बदलाव लागू करें देखें।

json
{ "ARKVORY_TRUSTED_PROXIES": "127.0.0.1,::1" }

जब API बिना TLS और बिना भरोसेमंद प्रॉक्सी के नॉन-लूपबैक पते पर सुनता है, तो शुरू होते समय http.plaintext_exposed लॉग करता है। सही प्रॉक्सी सेटअप इसे ट्रिगर नहीं करता।

कंसोल और उसका API पता ​

Arkvory जो कंसोल परोसता है वह उसी पते का इस्तेमाल करता है जहाँ से वह खोला गया था। यह केवल अपने ही सर्वर से बात करता है: उसकी कंटेंट सुरक्षा नीति कोई दूसरा पता अनुमत नहीं करती। प्रॉक्सी के पीछे यह https://arkvory.example.com/console/ पर अपरिवर्तित काम करता है।

कंसोल को किसी दूसरे वेब सर्वर पर होस्ट करने के लिए, उदाहरण के लिए किसी पोर्टल के साथ:

  1. इंस्टॉलेशन रूट में releases/<version>/apps/web/public/ से कंसोल फ़ाइलें दूसरे सर्वर पर कॉपी करें। उन्हें पथ /console/ पर, HTTPS के साथ, .js और .css के लिए सही MIME प्रकारों के साथ परोसें। हर Arkvory अपडेट के बाद उन्हें फिर से कॉपी करें।

  2. कॉपी की गई index.html में, Arkvory का पता सेट करें:

    html
    <meta name="arkvory-api-base-url" content="https://arkvory.example.com/" />
  3. यदि दूसरा सर्वर कंटेंट सुरक्षा नीति सेट करता है, तो connect-src को Arkvory पते की अनुमति दें और स्थानीय स्क्रिप्ट वर्कर की अनुमति दें।

  4. Arkvory में कंसोल के ओरिजिन की अनुमति दें। CORS देखें।

CORS ​

ARKVORY_CORS_ORIGINS में दूसरे पतों पर चलने वाले वेब एप्लिकेशन के ओरिजिन सेट करें और API रीस्टार्ट करें।

json
{ "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 में आपके ओरिजिन वाला होना चाहिए:

bash
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'

सेटअप जाँचें ​

  1. curl https://arkvory.example.com/health/status स्टेटस 200 और {"status":"ready"} लौटाता है। प्रमाणपत्र चेन बिना अपवादों के सत्यापित होती है।
  2. कंसोल खोलें, साइन इन करें और उसी पते से एक बड़ी फ़ाइल अपलोड करें।
  3. HTTPS पते का उपयोग करने वाली प्रोफ़ाइल के साथ arkvoryctl doctor चलाएँ। क्लाइंट पर प्रमाणपत्र जाँच बंद न करें: कमांड-लाइन क्लाइंट ऐसा नहीं कर सकता, और यह सादा HTTP केवल स्थानीय कंप्यूटर के लिए स्वीकार करता है। कमांड-लाइन क्लाइंट देखें।
  4. 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 ComposeCompose में अंतर्निहित 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 में जोड़ें और रीस्टार्ट करें

और संकेत समस्या निवारण और सुरक्षा में हैं।

Arkvory · ProAnimaStudio