আপনি কি এসএসএসের মাধ্যমে গিট কমান্ডের অ্যাক্সেসকে সীমাবদ্ধ করতে .ssh / অনুমোদিত_keys এ গিট শেল নির্দিষ্ট করতে পারেন?


37

আমি প্রমাণীকরণের জন্য একটি ssh কী ব্যবহার করতে সক্ষম হতে চাই, তবে তবুও ssh টানেলের মাধ্যমে কার্যকর করা যেতে পারে এমন কমান্ডগুলিকে সীমাবদ্ধ রাখি।

সাবভার্সনের মাধ্যমে, আমি .ssh / অনুমোদিত_কিজ ফাইলগুলি ব্যবহার করে এটি অর্জন করেছি:

command="/usr/local/bin/svnserve -t --tunnel-user matt -r /path/to/repository",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIetc...

কমান্ডটিতে আমি "/ usr / bin / git-cel" দিয়ে চেষ্টা করেছি, তবে আমি ঠিক মজাদার পুরানো fatal: What do you think I am? A shell?ত্রুটি বার্তাটি পেয়েছি ।

উত্তর:


30

নিম্নলিখিত আমার জন্য কাজ করে।

ইন ~/.ssh/authorized_keys:

command="./gitserve",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB…

ইন ~/gitserveস্ক্রিপ্ট:

#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"

মনে রাখবেন যে আপনি যদি gitserveহোম ডিরেক্টরি বাদে অন্য কোথাও রাখেন তবে আপনাকে command="./gitserve"প্যারামিটারটি সামঞ্জস্য করতে হবে authorized_keys


বিঙ্গো! এটি ঠিক তেমন কাজ করে যা আমি অর্জনের প্রত্যাশায় ছিলাম! ধন্যবাদ।
ম্যাট কনলি

তাই এই সম্পর্কিত পোস্টে stackoverflow.com/questions/5871652/... : তারা অন্য সমাধান এখানে নির্দেশ joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
টিম

1
@ টিম এটি মূলত একই সমাধান, তবে পার্ল ব্যবহার করে আমার ~ / গিটজার্ড স্ক্রিপ্টের বিষয়বস্তুটিকে অনুমোদিত কীগুলিতে আটকান। ব্যক্তিগতভাবে, আমি এটিকে একটি পৃথক স্ক্রিপ্টে রাখতে পছন্দ করি।
নীল মেহেহে

1
আমি বুঝতে পারি, আমি কেবল এটি রেফারেন্স হিসাবে যুক্ত করেছি added
টিম

এই কনফিগারেশনে আপনার কী শেল সেট করা আছে? /bin/bash?
এম পিক্সেল

33

সংযোজন স্ক্রিপ্টটি ব্যবহার না করেই আমি অনুমোদিতকিস ফাইলটিতে সফলভাবে গিট শেল ব্যবহার করতে পারি।

কীটি হ'ল \"এনভ ভেরিয়েবলটি জুড়ে।

Rhel6 ওপেনশ-সার্ভার -5.3p1-70.el6.x86_64- এ পরীক্ষিত:

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-dss AAAA...

+1 এটি সঠিক উত্তর, দেখুন svnweb.freebsd.org/base/head/crypto/openssh/…
টিনো

2
ব্যক্তিগতভাবে, আমি পুরো পথটি দিতাম git-shell, তবে এটি কেবল প্যারানাইয়া হতে পারে।
উলিরিচ শোয়ার্জ

যে ডিরেক্টরিটিতে অ্যাক্সেস রয়েছে তাতে কি কেউ সীমাবদ্ধ করার কোনও উপায় খুঁজে পেয়েছেন? আমি দেখতে পেলাম যে গিট শেল চালুর আগে আমি একটি ডিরেক্টরিতে সিডি করতে পারি তবে গিট শেল ".." এবং পরম পাথকে অনুমতি দেয়।
ইয়োক্টো

5

মহাকর্ষের সমাধানটি লাইনটি প্রতিস্থাপনের মাধ্যমে সহজেই কাজ করা যায়

        exec $SSH_ORIGINAL_COMMAND

লাইন দিয়ে

        git-shell -c "$SSH_ORIGINAL_COMMAND"

উদ্ধৃতিগুলি উপরে বর্ণিত সমস্যাগুলির যত্ন নিয়েছে এবং গিট শেলের সাথে এক্সিকিউটি প্রতিস্থাপন করা কিছুটা নিরাপদ বলে মনে হচ্ছে।


4

git-shellলগইন শেল হিসাবে ব্যবহার করার জন্য ডিজাইন করা হয়েছে, যাতে এটি -c "originalcommand"আর্গুমেন্ট হিসাবে গ্রহণ করবে । ওপেনএসএসএইচে "জোরপূর্বক আদেশগুলি" দিয়ে এটি হয় না; পরিবর্তে, জোর করে কমান্ডটি কনফিগার করা শেলকে দেওয়া হবে।

আপনি যা করতে পারেন তা হ'ল একটি স্ক্রিপ্ট যা এটি পরীক্ষা করে $SSH_ORIGINAL_COMMANDএবং তা কার্যকর করে। বাশ উদাহরণ :

#!/bin/bash

SSH_ORIGINAL_COMMAND=${SSH_ORIGINAL_COMMAND/#git /git-}

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        eval exec $SSH_ORIGINAL_COMMAND
        ;;
    *)
        echo "Go away." >&2
        exit 1
        ;;
esac

@ ম্যাট: গিট শেল (1) বলে কমান্ডগুলি আছে git <cmd>, তাই না git-<cmd>?
মাধ্যাকর্ষণ

হুম ... আমি যখন এটি চালালাম তখন যা দেখলাম তার অনুসারে আমি এই পরিবর্তন করেছি। বাশ স্ক্রিপ্ট এবং রুবি স্ক্রিপ্ট উভয় দিয়ে আমি কমান্ড হিসাবে "গিট-রিসিভ-প্যাক" দেখেছি saw আমার man git-shell(গিট ১..3.৩.৪) থেকে উদ্ধৃতি : বর্তমানে কেবলমাত্র চারটি কমান্ড কল করার অনুমতি রয়েছে, গিট-রিসিভ-প্যাক গিট-আপলোড-প্যাক এবং গিট-আপলোড-সংরক্ষণাগার একটি একক প্রয়োজনীয় আর্গুমেন্ট, বা সিভিএস সার্ভার সহ (গিটটি আহ্বান জানাতে) -cvsserver)।
ম্যাট কনলি

ফর্ম্যাটিং মন্তব্যগুলিতে কাজ করে না :(
ম্যাট কনলি

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

সমাধান, গুরুতরতার জন্য ধন্যবাদ, তবে এটি আমার পক্ষে কার্যকর নয়, নীল মেহেও যে একই কারণে রিপোর্ট করেছিলেন ... আমার গিটের 1.7.x সংস্করণটি রেপো নামটি একক উদ্ধৃতিতেও প্রেরণ করে, শেষ পর্যন্ত কারণ $SSH_ORIGINAL_COMMANDহতে পারে অবৈধ, এবং git-shell
এলোমেলো

1

আমি পাই নি grawity একই কারণে যে রিপোর্ট করা হয়েছিল জন্য কাজ করার 'র সমাধান নিল Mayhew (। অর্থাত Git ক্লায়েন্টের পাঠানো একক উদ্ধৃতি একটি অবৈধ ঘটাচ্ছে $SSH_ORIGINAL_COMMAND- আমি ব্যবহার করছি git v1.7.x)

তবে @ মুমকোড দ্বারা কার্যকর করা নিম্নলিখিত সমাধানগুলি কেবল কার্যকরভাবে কাজ করে:

https://moocode.com/posts/6-code-your-own-multi-user-private-git-server-in-5-minutes

রুবি এফটিডাব্লু! :-)


1

সম্পূর্ণতার জন্য, এবং যেহেতু মূল প্রশ্নটি নির্দিষ্ট করে না যে একই অ্যাকাউন্টটি নন-গিট জিনিসের জন্য ব্যবহারযোগ্য হতে হয়েছিল, তাই এর স্পষ্ট উত্তর হ'ল এটি ব্যবহার git-shellকরার নকশা করা হয়েছিল: এটি লগইন শেল হিসাবে সেট করুন (যেমন usermod, ইন /etc/passwd) যে ssh ব্যবহারকারীর জন্য।

আপনার যদি এমন একটি একক অ্যাকাউন্ট থাকে যা আপনি দুটি উপায়ে ব্যবহার করতে চান:

  • কী প্রমাণীকরণের সাথে সংযোগ করার সময়, কেবল গিটের জন্য ব্যবহার করুন
  • পাসওয়ার্ড প্রমাণীকরণের সাথে সংযোগ স্থাপন করার সময়, বা কোনও আলাদা ব্যক্তিগত কী ব্যবহার করার সময় একটি পূর্ণ শেল সরবরাহ করুন

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.