৭.১৪ গিট টুলস – ক্রেডেনশিয়াল স্টোরেজ
ক্রেডেনশিয়াল স্টোরেজ
আপনি যদি রিমোটের সাথে সংযোগ করার জন্য SSH transport ব্যবহার করেন, তাহলে আপনার পক্ষে passphrase ছাড়াই একটি কী(Key) থাকা সম্ভব, যা আপনাকে আপনার ইউজারনেম(username) এবং পাসওয়ার্ড(password) টাইপ না করে নিরাপদে ডেটা স্থানান্তর করতে দেয়। যাইহোক, HTTP প্রোটোকলের সাথে এটি সম্ভব নয় – প্রতিটি সংযোগের জন্য একটি ইউজারনেম(username) এবং পাসওয়ার্ড(password) প্রয়োজন। এটি দ্বি–ফ্যাক্টর(Two-factor) অথেনটিকেশন(Authentication) সহ সিস্টেমগুলির জন্য আরও কঠিন হয়ে ওঠে, যেখানে আপনি পাসওয়ার্ডের জন্য যে টোকেন ব্যবহার করেন তা এলোমেলোভাবে তৈরি হয় এবং উচ্চারণযোগ্য নয়।
সৌভাগ্যবশত, গিটের একটি ক্রেডেনশিয়াল সিস্টেম রয়েছে যা এটিতে সহায়তা করতে পারে। গিটের কয়েকটি বিকল্প নিচের বাক্সে দেওয়া হল:
- ডিফল্ট সব ক্যাশ(cache) করা হয় না. প্রতিটি সংযোগ আপনাকে আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ডের জন্য অনুরোধ করবে।
- “ক্যাশে” মোড একটি নির্দিষ্ট সময়ের জন্য ক্রেডেনশিয়ালকে ইন–মেমরিতে রাখে। কোনো পাসওয়ার্ড কখনোই ডিস্কে সংরক্ষিত থাকে না এবং 15 মিনিটের পর ক্যাশ থেকে মুছে ফেলা হয়।
- “স্টোর” মোড ডিস্কের একটি প্লেইন–টেক্সট ফাইলে ক্রেডেনশিয়ালগুলি সংরক্ষণ করে এবং সেগুলির মেয়াদ শেষ হয় না। এর মানে হল যে আপনি গিট হোস্টের জন্য আপনার পাসওয়ার্ড পরিবর্তন না করা পর্যন্ত, আপনাকে আর কখনও আপনার ক্রেডেনশিয়াল টাইপ করতে হবে না। এই পদ্ধতির নেতিবাচক দিক হল যে আপনার পাসওয়ার্ডগুলি আপনার হোম ডিরেক্টরিতে একটি প্লেইন ফাইলে ক্লিয়ারটেক্সটে সংরক্ষণ করা হয়।
- আপনি যদি ম্যাক(Mac) ব্যবহার করেন, গিট একটি “osxkeychain” মোডের সাথে আসে, যা আপনার সিস্টেম অ্যাকাউন্টের সাথে সংযুক্ত সুরক্ষিত কী–চেইন ক্রেডেনশিয়ালগুলি ক্যাশে করে। এই পদ্ধতিটি ডিস্কে ক্রেডেনশিয়ালগুলি সংরক্ষণ করে এবং সেগুলি কখনই মেয়াদোত্তীর্ণ হয় না, তবে সেগুলি একই সিস্টেমের সাথে এনক্রিপ্ট করা হয় যা HTTPS ক্রেডেনশিয়াল এবং সাফারি auto-fills সংরক্ষণ করে।
- আপনি যদি উইন্ডোজ ব্যবহার করেন, আপনি উইন্ডোজের জন্য গিট ইনস্টল করার সময় গিট ক্রেডেনশিয়াল ম্যানেজার ফিচারটি চালু করতে পারেন বা আলাদাভাবে একটি স্বতন্ত্র পরিষেবা হিসাবে সর্বশেষ GCM ইনস্টল করতে পারেন। এটি উপরে বর্ণিত “osxkeychain” helper এর মতো, কিন্তু সেনসিটিভ ডাটা নিয়ন্ত্রণ করতে Windows Credential Store ব্যবহার করে। এটি WSL1 বা WSL2-এ ক্রেডেনশিয়াল ও পরিবেশন করতে পারে। আরও তথ্যের জন্য GCM ইনস্টল নির্দেশাবলী দেখুন।
আপনি একটি গিট কনফিগারেশন ভ্যালু সেট করে এই পদ্ধতিগুলির মধ্যে একটি বেছে নিতে পারেন:
$ git config --global credential.helper cache
এই helpers গুলির কিছু বিকল্প আছে. “store” helper একটি –file <path> আর্গুমেন্ট নিতে পারে, যা কাস্টমাইজ করে যেখানে প্লেইন–টেক্সট ফাইল সংরক্ষণ করা হয় (ডিফল্ট হল ~/.git-credentials)। “cache” helper –timeout <seconds> অপশনটি গ্রহণ করে, যা তার ডেমন(daemon) চালানোর সময় পরিবর্তন করে (ডিফল্ট হল “900”, বা 15 মিনিট)। আপনি কীভাবে একটি কাস্টম ফাইল নামের সাথে “store” helper কনফিগার করবেন তার একটি উদাহরণ এখানে রয়েছে:
$ git config --global credential.helper 'store --file ~/.my-credentials'
গিট এমনকি আপনাকে বেশ কয়েকটি helper কনফিগার করতে দেয়। একটি নির্দিষ্ট হোস্টের জন্য ক্রেডেনশিয়ালগুলি সন্ধান করার সময়, গিট সেগুলিকে ক্রমানুসারে জিজ্ঞাসা করবে এবং প্রথম উত্তর দেওয়ার পরে থামবে। ক্রেডেনশিয়ালগুলি সংরক্ষণ করার সময়, গিট তালিকার(List) সমস্ত helpers কে ইউজারনেম(username) এবং পাসওয়ার্ড(password) পাঠাবে এবং তারা তাদের সাথে কী করতে হবে তা বেছে নিতে পারে।এখানে আপনার থাম্ব ড্রাইভে একটি ক্রেডেনশিয়াল ফাইল একটি .gitconfig থাকবে , কিন্তু ড্রাইভটি প্লাগ ইন না থাকলে কিছু টাইপিং সংরক্ষণ করতে ইন–মেমরি ক্যাশে ব্যবহার করতে চান সে ক্ষেত্রে এটি দেখতে এমন হবে :
[credential]
helper = store --file /mnt/thumbdrive/.git-credentials
helper = cache --timeout 30000
অভ্যন্তরীণ কিছু বিষয়:
কিভাবে এই সব কাজ করে? ক্রেডেনশিয়াল–হেল্পার সিস্টেমের জন্য গিট–এর রুট কমান্ড হল গিট ক্রেডেনশিয়াল, যা একটি আর্গুমেন্ট হিসাবে একটি কমান্ড নেয় এবং তারপরে stdin এর মাধ্যমে আরও ইনপুট নেয়।
এটি একটি উদাহরণ দিয়ে বোঝা সহজ হতে পারে। ধরা যাক যে একটি ক্রেডেনশিয়াল helper কনফিগার করা হয়েছে, এবং helper mygithost এর জন্য ক্রেডেনশিয়াল সংরক্ষণ করেছে। এখানে একটি সেশন রয়েছে যা “fill” কমান্ড ব্যবহার করে, যেটি ডাকা(call) হয় যখন গিট একটি হোস্টের জন্য ক্রেডেনশিয়ালগুলি সন্ধান করার চেষ্টা করে:
$ git credential fill (1)
protocol=https (2)
host=mygithost
(3)
protocol=https (4)
host=mygithost
username=bob
password=s3cre7
$ git credential fill (5)
protocol=https
host=unknownhost
Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7
- এটি কমান্ড লাইন যা ইন্টারেকশন শুরু করে।
- Git-credential তারপর stdin এ ইনপুটের জন্য অপেক্ষা করছে। আমরা এটিকে আমাদের জানা জিনিসগুলির সাথে প্রদান করি: প্রোটোকল এবং হোস্টনাম।
- একটি ফাঁকা লাইন নির্দেশ করে যে ইনপুট সম্পূর্ণ হয়েছে, এবং ক্রেডেনশিয়াল সিস্টেমের উত্তর দেওয়া উচিত যা এটি জানে।
- Git-credential তারপর ভার গ্রহণ করে, এবং এটি পাওয়া তথ্যের বিটগুলি দিয়ে stdout-এ লেখে।
- ক্রেডেনশিয়ালগুলি খুঁজে না পাওয়া গেলে, গিট ব্যবহারকারীকে ব্যবহারকারীর নাম(username) এবং পাসওয়ার্ড(password) জিজ্ঞাসা করে এবং সেগুলিকে ইনভোকিং stdout এ ফিরিয়ে দেয় (এখানে তারা একই কনসোলে সংযুক্ত)।
ক্রেডেনশিয়াল সিস্টেম আসলে একটি প্রোগ্রাম আহ্বান করছে যা গিট থেকে আলাদা; কোনটি এবং কিভাবে নির্ভর করে credential.helper কনফিগারেশন মানের উপর। এটি বিভিন্ন ফর্ম নিতে পারে:
Configuration Value | Behavior |
foo | Runs git-credential-foo |
foo -a –opt=bcd | Runs git-credential-foo -a –opt=bcd |
/absolute/path/foo -xyz | Runs /absolute/path/foo -xyz |
!f() { echo “password=s3cre7”; }; f | Code after ! evaluated in shell |
সুতরাং উপরে বর্ণিত helper দের প্রকৃতপক্ষে git-credential-cache, git-credential-store ইত্যাদি নাম দেওয়া হয়েছে এবং আমরা তাদের কমান্ড–লাইন আর্গুমেন্ট নিতে কনফিগার করতে পারি। এর জন্য সাধারণ ফর্ম হল “git-credential-foo [args] <action>।” stdin/stdout প্রোটোকল git-credential এর মতই, কিন্তু তারা কাজের একটি সামান্য ভিন্ন সেট ব্যবহার করে:
- get একটি ব্যবহারকারীর(User) নাম/পাসওয়ার্ড জোড়ার জন্য একটি request।
- store হল এই helper’s মেমরিতে ক্রেডেনশিয়াল এর একটি সেট সংরক্ষণ করার জন্য একটি request।
- erase প্রদত্ত বৈশিষ্ট্যগুলির জন্য এই helper মেমরি থেকে ক্রেডেনশিয়ালগুলি মুছে ফেলার জন্য।
স্টোর এবং মুছে ফেলার ক্রিয়াগুলির জন্য, কোনও প্রতিক্রিয়ার প্রয়োজন নেই (গিট এটিকে উপেক্ষা করে)। গেট অ্যাকশনের জন্য, যাইহোক, সাহায্যকারীর কথায় গিট খুবই আগ্রহী। যদি সাহায্যকারী দরকারী কিছু না জানে, তবে এটি কোন আউটপুট ছাড়াই প্রস্থান করতে পারে, কিন্তু যদি এটি জানে, তবে এটি সংরক্ষণ করা তথ্যের সাথে প্রদত্ত তথ্যকে বাড়িয়ে তুলতে হবে। আউটপুটকে অ্যাসাইনমেন্ট স্টেটমেন্টের একটি সিরিজের মতো বিবেচনা করা হয়; প্রদত্ত কিছু প্রতিস্থাপন করবে যা গিট ইতিমধ্যে জানে।
এখানে উপরে থেকে একই উদাহরণ, কিন্তু গিট–প্রমাণপত্র এড়িয়ে যাওয়া এবং সরাসরি গিট–ক্রেডেনশিয়াল–স্টোরে যাওয়া:
$ git credential-store --file ~/git.store store (1)
protocol=https
host=mygithost
username=bob
password=s3cre7
$ git credential-store --file ~/git.store get (2)
protocol=https
host=mygithost
username=bob (3)
password=s3cre7
- এখানে আমরা কিছু ক্রেডেনশিয়াল সংরক্ষণ করার জন্য git-credential-store কে বলি: https://mygithost অ্যাক্সেস করার সময় ব্যবহারকারীর(username) নাম “bob” এবং পাসওয়ার্ড “s3cre7” ব্যবহার করতে হবে।
- এখন আমরা সেই ক্রেডেনশিয়ালগুলি পুনরুদ্ধার করব। আমরা সংযোগের অংশগুলি সরবরাহ করি যা আমরা ইতিমধ্যেই জানি (https://mygithost), এবং একটি খালি লাইন।
- git-credential-store আমাদের উপরে সংরক্ষিত ব্যবহারকারীর নাম এবং পাসওয়ার্ড সহ উত্তর দেয়।
~/git.store ফাইলটি দেখতে কেমন তা এখানে:
https://bob:s3cre7@mygithost
এটি শুধুমাত্র লাইনের একটি সিরিজ, যার প্রতিটিতে একটি credential-decorated URL রয়েছে। osxkeychain এবং wincred helper রা তাদের ব্যাকিং স্টোরের নেটিভ ফরম্যাট ব্যবহার করে, যখন ক্যাশে তার নিজস্ব ইন–মেমরি ফর্ম্যাট ব্যবহার করে (যা অন্য কোন প্রক্রিয়া পড়তে পারে না)।
-
কাস্টম ক্রেডেনশিয়াল ক্যাশ:
git-credential-store এবং friends গিট থেকে আলাদা প্রোগ্রাম, এটি বোঝা খুব বেশি কিছু নয় যে, যেকোনও প্রোগ্রাম একটি গিট ক্রেডেনশিয়াল helper হতে পারে। Git দ্বারা প্রদত্ত helper’রা অনেক সাধারণ ব্যবহারের ক্ষেত্রে কভার করে, কিন্তু সব ক্ষেত্রে নয়। উদাহরণ স্বরূপ, ধরা যাক আপনার টিমের কিছু ক্রেডেনশিয়াল রয়েছে যা পুরো দলের সাথে ভাগ করা হয়েছে, সম্ভবত ডেপ্লয়মেন্ট এর জন্য। এগুলি একটি ভাগ করা ডিরেক্টরিতে সংরক্ষণ করা হয়, তবে আপনি সেগুলিকে আপনার নিজের ক্রেডেনশিয়াল এর জায়গায় রাখতে চান না, কারণ সেগুলি প্রায়শই পরিবর্তিত হয়৷ বিদ্যমান কোনো helper ই এটি কভার করে না; দেখা যাক আমাদের নিজেদের কনফিগারেশন করতে কী লাগবে। এই প্রোগ্রামের বেশ কয়েকটি মূল বৈশিষ্ট্য থাকা প্রয়োজন:- আমাদের মনোযোগ দিতে হবে শুধুমাত্র get; store এবং erase write অপারেশন এ, তাই সেগুলি পেয়ে গেলে আমরা পরিষ্কারভাবে বের(exit) হয়ে যাব ।
- Shared-credential ফাইলের ফাইল ফরম্যাটটি git-credential-store দ্বারা ব্যবহৃত একই রকম।
- সেই ফাইলের location টি মোটামুটি মানসম্মত, কিন্তু আমাদের উচিত ইউজারকে(User) একটি কাস্টম পাথ পাস করার অনুমতি দেওয়া।
#!/usr/bin/env ruby
require 'optparse'
path = File.expand_path '~/.git-credentials' # (1)
OptionParser.new do |opts|
opts.banner = 'USAGE: git-credential-read-only [options] '
opts.on('-f', '--file PATH', 'Specify path for backing store') do |argpath|
path = File.expand_path argpath
end
end.parse!
exit(0) unless ARGV[0].downcase == 'get' # (2)
exit(0) unless File.exists? path
known = {} # (3)
while line = STDIN.gets
break if line.strip == ''
k,v = line.strip.split '=', 2
known[k] = v
end
File.readlines(path).each do |fileline| # (4)
prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).first
if prot == known['protocol'] and host == known['host'] and user == known['username'] then
puts "protocol=#{prot}"
puts "host=#{host}"
puts "username=#{user}"
puts "password=#{pass}"
exit(0)
end
end
- এখানে আমরা কমান্ড–লাইন(command-line) অপশন পার্স করি, যা ইউজারকে(User) ইনপুট ফাইলটি নির্দিষ্ট করার অনুমতি দেয়। ডিফল্ট(default) হল ~/.git-credentials।
- এই প্রোগ্রামটি তখনই সাড়া দেয় যদি get অ্যাকশন পাওয়া যায় এবং ব্যাকিং–স্টোর(backing-store) ফাইলটি বিদ্যমান থাকে।
- এই লুপ stdin থেকে প্রথম ফাঁকা(new line) লাইনে না পৌঁছানো পর্যন্ত পড়ে। ইনপুটগুলি পরবর্তী রেফারেন্সের জন্য known হ্যাশে সংরক্ষণ করা হয়।
- এই লুপ স্টোরেজ, ফাইলের কন্টেন্ট read করে এবং মিলানোর চেষ্টা করে । “known” থেকে প্রোটোকল, হোস্ট এবং username যদি এই লাইনের সাথে মিলে যায় , প্রোগ্রামটি ফলাফলগুলিকে(results) stdout এ প্রিন্ট করে এবং প্রোগ্রামটি থেকে বের(exit) হয়ে যায়।
আমরা আমাদের helper কে git-credential-read-only হিসাবে সংরক্ষণ করব, এটিকে আমাদের PATH-এ কোথাও রাখব এবং এটিকে এক্সিকিউটেবল চিহ্নিত করব। একটি ইন্টারেক্টিভ সেশন দেখতে কেমন তা এখানে দেওয়া হল :
$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost
username=bob
protocol=https
host=mygithost
username=bob
password=s3cre7
যেহেতু এটির নাম “git-” দিয়ে শুরু হয়, তাই আমরা কনফিগারেশন মানের জন্য সাধারণ সিনট্যাক্স ব্যবহার করতে পারি:
$ git config --global credential.helper 'read-only --file /mnt/shared/creds'
আপনি দেখতে পাচ্ছেন, এই সিস্টেমটি extend করা বেশ সহজ, এবং আপনার এবং আপনার দলের জন্য কিছু সাধারণ সমস্যা সমাধান করতে পারে।