Subversion ভার্চুয়াল হোস্টকে VPN ঠিকানায় নির্দেশ করলে কোন সাইট অনুরোধের উত্তর দেবে তা বদলায়, কে অনুরোধ পাঠাতে পারবে তা নয়। অ্যাক্সেস যাচাই পরে ঘটে, URL-এর সঙ্গে মিলে যাওয়া সেকশনের নিয়ম অনুযায়ী, এবং হোস্টের নাম কখনও সেই সিদ্ধান্তে ঢোকে না। ServerName যদি আপনার একমাত্র পরিবর্তন হয়, তবে রিপোজিটরি গতকালের মতোই পৌঁছানোযোগ্য। কনফিগারেশনে দুটি আলাদা প্রশ্নের উত্তর দিতে হবে: কোন সকেট সংযোগ গ্রহণ করেছে এবং অনুরোধ কোন পরিচয় বহন করেছিল।

ServerName আসলে কী নির্ধারণ করে

নামভিত্তিক ভার্চুয়াল হোস্টিং Host হেডারকে ServerName ও ServerAlias এন্ট্রির সঙ্গে তুলনা করে, একটি হোস্ট বেছে নেয় এবং সেই হোস্টকে অনুরোধ সামলাতে দেয়। সংযোগটি আগেই সার্ভারের মালিকানাধীন একটি Listen সকেট গ্রহণ করেছিল, হোস্টের নয়। তাই ব্যক্তিগত দেখতে একটি নাম কোনো সুরক্ষা দেয় না: যে কোনো ক্লায়েন্ট সকেটে পৌঁছাতে পারলে ওই Host হেডার পাঠাতে পারে। নামটি একটি রাউটিং কী, আর রাউটিং কী বেছে নেয় আহ্বানকারী।

অনুমান না করেই ম্যাপিং দেখতে পারেন। apachectl -S প্রতিটি হোস্ট, তার পোর্ট ও নাম ছাপে এবং ঠিকানার জন্য কোনটি ডিফল্ট তা চিহ্নিত করে।

RequireAll হলো সেই ধারক যা উভয় যাচাই বাধ্যতামূলক করে

Apache 2.4 একটি সেকশনের Require নির্দেশগুলোকে একটি অন্তর্নিহিত RequireAny-তে মুড়ে দেয়, তাই দুটি খালি নির্দেশ মানে যেকোনো একটি যথেষ্ট। ধারকটি যোগ করুন আর অর্থ উল্টে যায়:

<Location /svn/repo>
    AuthType Basic
    AuthName "Subversion"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/svn.htpasswd
    <RequireAll>
        Require ip 10.8.0.0/24
        Require valid-user
    </RequireAll>
</Location>

RequireAll উভয় শর্ত দাবি করে: টানেল রেঞ্জের ভিতরের উৎস ঠিকানা এবং রিপোজিটরি যে ব্যবহারকারীকে গ্রহণ করে। Subversion URL-এর জন্য VPN-শুধু বলতে এটাই বোঝানো উচিত। mod_authz_core রেফারেন্স ধারকের নিয়মগুলো নথিভুক্ত করে। ব্লকটি রিপোজিটরির বিদ্যমান Location-এর ভিতরে রাখুন এবং আগে থেকে কাজ করা DAV নির্দেশগুলো নিজের জায়গায় রাখুন, কারণ এই টুকরোটি AuthType, পাসওয়ার্ড ফাইল বা পাথ-স্তরের অনুমোদনের কোনোটিই প্রতিস্থাপন করে না।

উৎস যাচাই আসে mod_authz_host থেকে, তাই অন্য কিছু ডিবাগ করার আগে নিশ্চিত করুন এটি লোড হয়েছে: apachectl -M | grep authz_host।

Apache যে ঠিকানা মূল্যায়ন করে তা হলো সকেট ঠিকানা

Require ip সংযোগের জন্য Apache যে ঠিকানা লিপিবদ্ধ করেছে তার সঙ্গে তুলনা করে, যা সবসময় ক্লায়েন্ট নিজের বলে মনে করা ঠিকানা নয়।

VPN যখন অনুবাদ ছাড়াই নিজের ঠিকানা রুট করে, Apache টানেল ঠিকানা দেখে এবং 10.8.0.0/24 মিলে যায়। যখন গেটওয়ে অনুবাদ করে, Apache গেটওয়ে দেখে এবং নিয়মটি নীরবে কিছুর সঙ্গে মেলে না; হোস্টের সামনে TLS শেষ করা লোড ব্যালেন্সারের পেছনেও একই ঘটনা ঘটে। ওই ক্ষেত্রের জন্য mod_remoteip আছে। ব্যালেন্সারের জন্য RemoteIPTrustedProxy-এর সঙ্গে RemoteIPHeader X-Forwarded-For লিপিবদ্ধ ঠিকানা প্রতিস্থাপন করে, এবং কেবল তখনই রেঞ্জের তুলনা করার মতো কিছু থাকে।

যেকোনো ফরওয়ার্ডিং হেডার বিশ্বাস করা কোনো নিয়ম না থাকার চেয়েও খারাপ। যে কোনো ক্লায়েন্ট 10.8.0.9 ধারণ করা X-Forwarded-For পাঠিয়ে এমন রেঞ্জ যাচাই মেটাতে পারে যা কখনও বিশ্বস্ত হপে নোঙর করা হয়নি।

শ্রোতা ও রিপোজিটরি নীতি স্তরে স্তরে প্রয়োগ করুন

বাইন্ডিং একটি আলাদা নিয়ন্ত্রণ এবং প্রায়ই সহজতর। Listen 10.8.0.1:443 নির্ধারণ করে কোন সকেট থাকবে, আর কখনও না খোলা সকেটে অনুরোধ হোস্ট বেছে নিতে পারে না। মূল্য হলো স্টার্টআপ ক্রম: Apache শুরু হওয়ার সময় টানেল ইন্টারফেস ডাউন থাকলে বাইন্ড ব্যর্থ হয় এবং সার্ভিস ওঠে না। এটিকে ইউনিট ক্রমের সঙ্গে জোড়া দিন, বা টানেল থেকে স্বাধীনভাবে বিদ্যমান ঠিকানায় বাইন্ড করুন।

পাথের অনুমতি AuthzSVNAccessFile-এ থাকে। সাইটের বৈধ অ্যাকাউন্ট প্রজেক্ট পাথে লেখার অনুমতির সমান মঞ্জুরি নয়, এবং নেটওয়ার্ক নিয়ম তা বদলায় না।

ব্লকটি অন্তর্ভুক্ত ফাইলে থাকলে সেকশন একত্রীকরণে নজর দিন। Apache নেস্টেড সেকশন জুড়ে অনুমোদন ধারকগুলো একত্র করে এবং সবচেয়ে নির্দিষ্ট মিলে যাওয়া সেকশন দাবিটি যোগ না করে প্রতিস্থাপন করতে পারে, তাই সংকীর্ণ সেকশন নিজের নিয়ম দিলে /svn-এর নিয়ম /svn/repo/trunk পর্যন্ত না পৌঁছাতে পারে।

সমাপ্ত বলার আগে উভয় প্রত্যাখ্যান প্রমাণ করুন

একটি নয়, চারটি অনুরোধ পরীক্ষা করুন। VPN-এর ভিতরে বৈধ অ্যাকাউন্টে রিপোজিটরির তালিকা পাওয়া উচিত। VPN-এর ভিতরে ভুল পাসওয়ার্ডে তালিকা নয়, 401 পাওয়া উচিত। VPN-এর বাইরে বৈধ শংসাপত্রে 403 পাওয়া উচিত, এবং বিকল্প হোস্টনামে একই সার্বজনীন অনুরোধও একইভাবে ব্যর্থ হতে হবে।

প্রতি ক্ষেত্রে একটি কমান্ডই যথেষ্ট: curl -sI -u user:pass https://svn.example.com/svn/repo/, তারপর স্টেটাস লাইন পড়ুন। কাজ করা ক্ষেত্রটি প্রকৃত ক্লায়েন্ট দিয়েও পুনরাবৃত্তি করুন, কারণ svn info সেই DAV পদ্ধতিগুলো অনুশীলন করে যা কমিট ও আপডেট ব্যবহার করবে।

চারটি ফলাফলের যেকোনোটি আপনার অভীষ্ট নীতির সঙ্গে না মিললে কনফিগারেশন শেষ হয়নি, এবং হোস্টের নাম বদলালে তা বদলাবে না।

সম্পর্কিত নিবন্ধ