গিট সংগ্রহস্থলের পাসওয়ার্ডগুলি ব্যবহার করার জন্য সেরা অনুশীলন কী?


225

আমি একটি ছোট বাশ স্ক্রিপ্ট পেয়েছি যা আমি টুইটার অ্যাক্সেস করতে এবং নির্দিষ্ট পরিস্থিতিতে একটি গ্রোল বিজ্ঞপ্তি পপআপ করতে ব্যবহার করি। স্ক্রিপ্ট দিয়ে আমার পাসওয়ার্ড সংরক্ষণ করার হ্যান্ডেল করার সর্বোত্তম উপায় কী?

আমি এই স্ক্রিপ্টটি গিট রেপোতে প্রতিশ্রুতিবদ্ধ করতে এবং এটি গিটহাবের কাছে উপলভ্য করতে চাই, তবে আমি ভাবছি যে এটি করার সময় আমার লগইন / পাসওয়ার্ডটি ব্যক্তিগত রাখার সর্বোত্তম উপায় কোনটি। বর্তমানে, পাসওয়ার্ডটি স্ক্রিপ্টেই সংরক্ষণ করা হয়েছে। আমি ধাক্কা দেওয়ার আগে এই মুহুর্তটি সরাতে পারছি না কারণ সমস্ত পুরানো কমিটগুলিতে পাসওয়ার্ড থাকবে। পাসওয়ার্ড ছাড়া বিকাশ একটি বিকল্প নয়। আমি কল্পনা করেছি যে আমার কোনও বাহ্যিক কনফিগার ফাইলে পাসওয়ার্ডটি সংরক্ষণ করা উচিত, তবে আমি ভেবেছিলাম যে চেষ্টা করার আগে এবং কিছু একসাথে রাখার আগে এটি হ্যান্ডেল করার কোনও প্রতিষ্ঠিত উপায় আছে কিনা তা আমি পরীক্ষা করে দেখব।

উত্তর:


256

এটি করার সাধারণ উপায় হ'ল একটি কনফিগারেশন ফাইল থেকে পাসওয়ার্ডের তথ্য পড়া। যদি আপনার কনফিগারেশন ফাইলটি কল করা হয় foobar.config, তবে আপনি foobar.config.exampleনমুনা ডেটা সম্বলিত সংগ্রহস্থলের কাছে কল করা একটি ফাইল প্রতিশ্রুতিবদ্ধ করবেন । আপনার প্রোগ্রামটি চালানোর জন্য, আপনি foobar.configআপনার আসল পাসওয়ার্ড ডেটা সহ একটি স্থানীয় (ট্র্যাকড নয়) ফাইল তৈরি করবেন ।

পূর্ববর্তী কমিটগুলি থেকে আপনার বিদ্যমান পাসওয়ার্ডটি ফিল্টার করতে, সংবেদনশীল ডেটা সরানোর জন্য গিটহাব সহায়তা পৃষ্ঠাটি দেখুন ।


4
বিটিডব্লিউ, আপনি রেপোতে foobar.config উদাহরণ যুক্ত করতে পারেন এবং তারপরে .ignore ফাইলটিতে foobar.config যুক্ত করতে পারেন। ক্লোন করা হয়ে গেলে এইভাবে foobar.config উদাহরণটি উপস্থিত হবে এবং আপনার আসল পাসওয়ার্ড রেপোতে যুক্ত হবে না।
মিঃ_চিম্প

16
@ মিঃ_চিম্প: ইতিমধ্যে ভান্ডারে থাকা .gitignoreট্র্যাক হওয়া ফাইলগুলিতে ফাইল প্রযোজ্য না । উদাহরণস্বরূপ, একটি পরিবর্তিত ফাইল এটি ইতিমধ্যে প্রবেশ থাকলেও যুক্ত করবে । git add -u.gitignore
গ্রেগ হিউগিল

1
পরিপূরক হিসাবে, দুর্ঘটনাক্রমে আপনি কনফিগার ফাইলটি যুক্ত করেছেন এবং আপনি এটি গিট ইতিহাস থেকে মুছতে চান এমন ক্ষেত্রে এখানে একটি আকর্ষণীয় লিঙ্ক রয়েছে: help.github.com/articles/remove-sensitive-data
Loïc Lopes

16
কীভাবে আপনি আপনার দলের সাথে এই পাসওয়ার্ডগুলি ভাগ করে নেবেন? একটি জিনিসের স্থানীয় কপি রয়েছে (রেপোর প্রতিশ্রুতিবদ্ধ নয়), অন্যটি এটি স্বয়ংক্রিয় সরঞ্জামগুলি (স্থাপনা ইত্যাদির জন্য) এমনকি একটি বড় দলের সাথে ভাগ করে নেওয়ার জন্য রয়েছে
ব্লুফাস্ট

2
আমার কাছে ড্যাঙ্গনফাস্টের মতো একই প্রশ্ন রয়েছে। এটি একটি বড় দলের জন্য ব্যবহারিক বলে মনে হচ্ছে না।
জ্যাকব স্ট্যাম্ম

25

এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে পাসওয়ার্ড (বা এপিআই কী) সেট করার জন্য একটি পদ্ধতির উপায় হতে পারে। সুতরাং এই পাসওয়ার্ডটি সংশোধন নিয়ন্ত্রণের বাইরে।

বাশের সাহায্যে আপনি পরিবেশের পরিবর্তনশীল ব্যবহার করে সেট করতে পারেন

export your_env_variable='your_password'

ট্র্যাভিসের মতো অবিচ্ছিন্ন ইন্টিগ্রেশন পরিষেবাদির সাথে এই পদ্ধতির ব্যবহার করা যেতে পারে , আপনার কোড (পাসওয়ার্ড ছাড়াই) একটি গিটহাবের সংগ্রহস্থলে সংরক্ষণ করা ট্র্যাভিস দ্বারা চালানো যেতে পারে (আপনার পাসওয়ার্ডটি পরিবেশের ভেরিয়েবল ব্যবহার করে সেট করা থাকে)।

বাশের সাহায্যে আপনি পরিবেশের পরিবর্তনশীলের মান ব্যবহার করতে পারেন:

echo "$your_env_variable"

পাইথনের সাহায্যে আপনি পরিবেশের পরিবর্তনশীলের মান ব্যবহার করতে পারেন:

import os
print(os.environ['your_env_variable'])

পিএস: জেনে রাখুন এটি সম্ভবত কিছুটা ঝুঁকিপূর্ণ (তবে এটি একটি সাধারণ প্রচলিত অভ্যাস) https://www.bleepingcomputer.com/news/security/javascript-packages-caught-steasing-en ماحول-variables/

পিএস 2: "কীভাবে নিরাপদে এপিআই কী সংরক্ষণ করতে হবে "dev.to শিরোনামে এই নিবন্ধটি পড়ার জন্য আকর্ষণীয় হতে পারে।


1
কীভাবে সম্ভাব্য "অনিরাপদ" কোডটি আপনার পরিবেশের ভেরিয়েবলের বিষয়বস্তুগুলি পড়তে পাঠায় না?
gorootde


16

কি গ্রেগ বলেন কিন্তু আমি যোগ চাই যে এটি একটি ফাইল চেক করতে একটি ভাল ধারণা foobar.config-TEMPLATE

এটিতে উদাহরণের নাম, পাসওয়ার্ড বা অন্যান্য কনফিগারেশন তথ্য থাকা উচিত। তারপরে এটি খুব স্পষ্ট যে foobar.config- এ কী কোড থাকা উচিত, সমস্ত কোডটি না foobar.configদেখে।

প্রায়শই কনফিগার মানগুলি স্পষ্টতই অকার্যকর হতে পারে যেমন ডাটাবেস সংযোগের স্ট্রিং এবং একই জাতীয় জিনিস।


7

আপনার সঠিক সমস্যাটি কী তা নির্ভর করে স্টোরগুলিতে পাসওয়ার্ডগুলি ব্যবহার করা বিভিন্নভাবে পরিচালনা করা হবে।

1. এটি করবেন না।

এবং করা এড়ানোর উপায়গুলি কয়েকটি জবাবগুলিতে itাকা থাকে - .gitignore, config.example, ইত্যাদি

  • .gitignore: সার্ভার ইত্যাদিতে স্টোর করুন তবে গিট নয় (দুর্বল সমাধান)
  • পরিবেশ পরিবর্তনশীল: https://stackoverflow.com/a/30664318/3070485
  • কনফিগার। উদাহরণ: https://stackoverflow.com/a/2397905/3070485
  • কমান্ড লাইন প্যারামিটার: প্রোগ্রাম স্টার্টআপে ম্যানুয়ালি পাসওয়ার্ড প্রবেশ করান

বা 2. কেবল অনুমোদিত ব্যক্তিদের কাছেই সংগ্রহস্থলটিকে অ্যাক্সেসযোগ্য করে তুলুন

অর্থাত্ পাসওয়ার্ড জানার অনুমতিপ্রাপ্ত লোক। chmodএবং ব্যবহারকারী গোষ্ঠী মাথায় আসে; এছাড়াও যদি আপনি আপনার ভান্ডারগুলি বা সার্ভারগুলি বাহ্যিকভাবে হোস্ট করেন তবে গিথুব বা এডাব্লুএস কর্মীদের কি জিনিস দেখার অনুমতি দেওয়া উচিত?

বা ৩. সংবেদনশীল ডেটা এনক্রিপ্ট করুন (এই উত্তরটির উদ্দেশ্য)

আপনি যদি কোনও কনফিগারেশন ফাইলগুলি সংবেদনশীল তথ্য (যেমন পাসওয়ার্ড সহ) কোনও সর্বজনীন স্থানে সংরক্ষণ করতে চান তবে এটি এনক্রিপ্ট করা দরকার। সংগ্রহস্থল থেকে পুনরুদ্ধার করার সময় ফাইলগুলি ডিক্রিপ্ট করা যেতে পারে, বা এমনকি তাদের এনক্রিপ্ট করা ফর্ম থেকে সরাসরি ব্যবহার করা যেতে পারে।

এনক্রিপ্ট করা কনফিগারেশন ডেটা ব্যবহারের জাভাস্ক্রিপ্ট সমাধানের একটি উদাহরণ নীচে দেখানো হয়েছে।

const fs = require('fs');
const NodeRSA = require('node-rsa');

let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');

console.log('decrypted: ', config);

ডিক্রিপ্ট করা কনফিগারেশন ফাইল

সুতরাং আপনি জাভাস্ক্রিপ্টের কয়েকটি লাইনে একটি এনক্রিপ্ট করা কনফিগারেশন ফাইল পুনরুদ্ধার করতে পারেন।

নোট করুন যে config.RSAএকটি গিট সংগ্রহস্থলের মধ্যে একটি ফাইল স্থাপন করা কার্যকরভাবে এটি একটি বাইনারি ফাইল তৈরি করে এবং তাই এটি গিটের মতো কোনও কিছুর অনেক সুবিধা হারাতে পারে, যেমন চেরি পরিবর্তন করে এটির ক্ষমতা।

এর সমাধান হতে পারে মূল মান জোড়া বা সম্ভবত কেবল মানগুলি এনক্রিপ্ট করা। আপনি সমস্ত মান এনক্রিপ্ট করতে পারেন, উদাহরণস্বরূপ যদি আপনার সংবেদনশীল তথ্যের জন্য পৃথক ফাইল থাকে বা আপনার যদি একটি ফাইলে সমস্ত মান থাকে তবে সংবেদনশীল মানগুলি এনক্রিপ্ট করতে পারেন। (নিচে দেখ)

আমার উদাহরণটি একটু এটির সাথে একটি পরীক্ষা করুন, অথবা একটি উদাহরণ হিসাবে এটি কিছু আরএসএ কী ও একটি এনক্রিপ্ট করা কনফিগ ফাইলের অস্তিত্ব অনুমান থেকে শুরু করতে যেমন অনুপস্থিত কারো কাছে অনর্থক config.RSA

সুতরাং এখানে আরএসএ কীগুলি তৈরি করতে কোডের কয়েকটি অতিরিক্ত লাইন যুক্ত হয়েছে এবং এতে খেলতে একটি কনফিগারেশন ফাইল রয়েছে।

const fs = require('fs');
const NodeRSA = require('node-rsa');

/////////////////////////////
// Generate some keys for testing
/////////////////////////////

const examplekey = new NodeRSA({b: 2048});

fs.writeFileSync('private.key', examplekey.exportKey('pkcs8-private'));
fs.writeFileSync('public.key', examplekey.exportKey('pkcs8-public'));

/////////////////////////////
// Do this on the Machine creating the config file
/////////////////////////////

const configToStore = {Goodbye: 'Cruel world'};

let publickey = new NodeRSA();
publickey.importKey(fs.readFileSync('public.key', 'utf8'));

fs.writeFileSync('config.RSA', publickey.encrypt(configToStore, 'base64'), 'utf8');

/////////////////////////////
// Do this on the Machine consuming the config file
/////////////////////////////

let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));

const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);

শুধুমাত্র এনক্রিপ্ট মান

fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');

এখানে চিত্র বর্ণনা লিখুন

আপনি এ জাতীয় কিছু ব্যবহার করে এনক্রিপ্ট করা মান সহ একটি কনফিগার ফাইল ডিক্রিপ্ট করতে পারেন।

const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
    config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});

পৃথক লাইনে প্রতিটি কনফিগারেশন আইটেমের সাথে (যেমন Helloএবং Goodbyeউপরে), গিট কোনও ফাইলের মধ্যে কী চলছে তা আরও ভালভাবে সনাক্ত করবে এবং সম্পূর্ণ ফাইলের পরিবর্তে তথ্যের আইটেমগুলিতে পরিবর্তনগুলি সংরক্ষণ করবে। গিটটি মার্জ এবং চেরি পিকস ইত্যাদি আরও ভালভাবে পরিচালনা করতে সক্ষম হবে।

তবে সংবেদনশীল তথ্যে আপনি যত পরিবর্তন নিয়ন্ত্রণ করতে চান তত বেশি আপনি নিরাপদ রিপোজিটরি সমাধান (২) এর দিকে এবং এনক্রিপটেড ইনফো (3) সমাধান থেকে দূরে সরে যাচ্ছেন।


3

কেউ ভল্ট ব্যবহার করতে পারে যা টোকেন, পাসওয়ার্ড, শংসাপত্র, এপিআই কী ইত্যাদির সুরক্ষা, সঞ্চয় এবং নিয়ন্ত্রণ অ্যাক্সেসের উদাহরণস্বরূপ উত্তরযোগ্য আনসিবল ভল্ট ব্যবহার করে যা প্লেবুকগুলিতে ব্যবহৃত পাসওয়ার্ড বা শংসাপত্রগুলির সাথে সম্পর্কিত হয়


আমি অবশ্যই একটি উদাহরণ কনফিগার ফাইল তৈরির সাথে তুলনায় অবশ্যই অ্যানসিটেবল ভল্টকে অতিরিক্ত জটিল বলে মনে করি।
icc97

@ আইসিসি ৯7 হ্যাঁ এটি দুঃখজনক সত্য। তবে আমাদের এই সম্ভাবনার কথা উল্লেখ করা দরকার। আমার মতে, আরও জটিল কাজের জন্য একক-ব্যবহারকারীর পরিবেশের জন্য কয়েকটি পাসওয়ার্ড সংরক্ষণ করা শুরু থেকেই বিশেষ সমাধানগুলি ব্যবহার করা ভাল।
এল রুসো

2
ভবিষ্যতের পাঠকদের সহায়তা করার জন্য: ভল্ট এবং উত্তরীয় ভল্ট একই ধরণের নামগুলির সাথে একেবারেই ভিন্ন সম্পর্কযুক্ত প্রকল্প
bltavares

2

এখানে আমি ব্যবহার করি এমন একটি কৌশল:

আমি আমার হোম ফোল্ডারে একটি ফোল্ডার তৈরি করি যার নাম: .config

সেই ফোল্ডারে আমি পাসওয়ার্ড এবং কীগুলি বহিরাগত করতে চাই এমন যে কোনও সংখ্যক জিনিসের জন্য কনফিগার ফাইল রাখি।

আমি সাধারণত বিপরীত ডোমেন নেম সিনট্যাক্স ব্যবহার করি:

com.example.databaseconfig

তারপরে বাশ স্ক্রিপ্টে আমি এটি করি:

#!/bin/bash
source $HOME/.config/com.example.databaseconfig ||exit 1

|| exit 1প্রস্থান স্ক্রিপ্ট ঘটায় যদি এটা কনফিগ ফাইল লোড করতে সক্ষম নয়।

আমি সেই কৌশলটি ব্যাশ, অজগর এবং পিপীলিকার স্ক্রিপ্টগুলির জন্য ব্যবহার করেছি।

আমি বেশ ভৌতিক এবং আমি মনে করি না যে একটি .gitignore ফাইল অসাবধানতা পরীক্ষা-নিরীক্ষণ প্রতিরোধ করার জন্য যথেষ্ট শক্তিশালী। এছাড়াও, এটি পর্যবেক্ষণ করার মতো কিছুই নেই, সুতরাং যদি চেক-ইন ঘটে তবে কেউই এটির মোকাবেলা করার জন্য খুঁজে পাবে না।

যদি কোনও নির্দিষ্ট অ্যাপ্লিকেশনটির একাধিক ফাইলের প্রয়োজন হয় তবে আমি একটি একক ফাইলের চেয়ে সাব-ফোল্ডার তৈরি করি।


1

যদি আপনি রেলগুলিতে রুবি ব্যবহার করেন তবে ফিগারো রত্নটি খুব ভাল, সহজ এবং নির্ভরযোগ্য। উত্পাদন পরিবেশের সাথে এটিরও মাথাব্যথা কম।


4
সেই রত্নটি কী করে সে সম্পর্কে আপনি কিছু বিশদ দিতে পারেন? এইভাবে এটি (সম্ভাব্য) বহু ভাষায় প্রযোজ্য একটি 'অনুশীলন' হিসাবে বিবেচিত হতে পারে।
ম্যাটুমোটু

medium.com/@MinimalGhost/... একটি ওভারভিউ, এটি মূলত একটি কনফিগারেশন ফাইল থেকে কাপড় পুলিংয়ের পরিচালনা বলে মনে হয় হয়েছে
tripleee

0

বিশ্বাস কিন্তু যাচাই.

এতে .gitignoreরেপো থেকে একটি "সুরক্ষিত" ডিরেক্টরি বাদ দেওয়া হবে:

secure/

তবে আমি @ মাইকেল পটারের ভৌগলিকতা ভাগ করছি । .Gitignore যাচাই করার জন্য, এখানে একটি পাইথন ইউনিট পরীক্ষা রয়েছে যা এই "সুরক্ষিত" ডিরেক্টরিটি যদি কখনও চেক ইন হয় তবে একটি ক্ল্যাক্সন বাড়িয়ে তুলবে the

def test_github_not_getting_credentials(self):
    safety_url = 'https://github.com/BobStein/fliki/tree/master/static'
    danger_url = 'https://github.com/BobStein/fliki/tree/master/secure'

    self.assertEqual(200, urllib.request.urlopen(safety_url).status)

    with self.assertRaises(urllib.error.HTTPError):
        urllib.request.urlopen(danger_url)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.