Использование git-shell и ограничение разработчиков на принятие собственных проектов - PullRequest
8 голосов
/ 18 января 2010

Мы используем git-shell, чтобы гарантировать, что учетная запись git используется только для операций git.Это прекрасно работает.

Однако прежде чем мы перейдем к использованию git на полную ставку, как нам настроить его подобно github, согласно которому в зависимости от вашего открытого ключа вы можете фиксировать только свои собственные репозитории?

Насколько я могу судить, github люди могут кататься по своим git-shell, исходный код кажется очень простым для взлома

Ответы [ 3 ]

14 голосов
/ 19 января 2010

Я использую что-то более простое, все, что вам нужно, это настроить три файла: файл authorized_keys, файл gitsecurity.rb и файл разрешений gitpermissions. Для простоты все они могут пойти в папку git account .ssh. (Базовые навыки администратора Unix, необходимые для понимания здесь)

Файл gitpermissions выглядит следующим образом и должен быть достаточно понятен:

repo1.git|jane|rw
repo1.git|james|r
repo2.git|bob|rw

Файл autorized_keys выглядит примерно так:

command="/Users/git/.ssh/gitsecurity.rb jacob",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa rFaivBw.....5Rws jacob
command="/Users/git/.ssh/gitsecurity.rb bob",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa rFaivBw.....5Rws bob

Наконец, скрипт gitsecurity.rb, просто скопируйте и вставьте его:

#!/usr/bin/ruby

class GitPermission
    attr_accessor :username;
    attr_accessor :repository;
    attr_accessor :read;
    attr_accessor :write;

def initialize(line)
    bits = line.split('|');
    if(bits.length!=3)
        $stderr.puts "Invalid configuration file"
        Process.exit(4)
    end
    @repository = bits[0]
    @username = bits[1]
    @read = bits[2].include?("r")
    @write = bits[2].include?("w")
end

end

if(!ENV.has_key?("SSH_ORIGINAL_COMMAND"))
    $stderr.puts "SSH not allowed to the git account."
    Process.exit(1);
end
command = ENV["SSH_ORIGINAL_COMMAND"];

if(!ARGV.length == 1)
    $stderr.puts "Authorised keys file misconfigured, username not specified correctly."
    Process.exit(1);
end

if(!ARGV[0].match(/^[A-Za-z0-9]+$/))
    $stderr.puts "Authorised keys file misconfigured, username contains invalid characters: "+ARGV[0];
    Process.exit(1);
end
username = ARGV[0]

if(!command.match(/^git[ -]upload-pack /) && !command.match(/^git[ -]receive-pack /))
    $stderr.puts "Only git commands are allowed."
    Process.exit(2);
end

repository = command[(command.index(' ')+1)..-1]

if(!repository.match(/'.*'/))
    $stderr.puts "Repository parameter incorrect."
    Process.exit(2);
end
repository = repository[1,repository.length-2]

begin
    file = File.new("/Users/git/.ssh/gitpermissions", "r")
    while (line = file.gets)
        p = GitPermission.new(line);
        if(p.repository == repository && p.username == username)
            if((p.write == true || (p.read == true && command.match(/^git[ -]upload-pack/))) )
                exec "/usr/local/git/bin/" + command
                Process.exit(0);
            end
        end
    end
    file.close
rescue => err
    $stderr.puts "Problem with server configuration: #{err}"
    Process.exit(4)
end

$stderr.puts "You do not have permission to complete this operation"
Process.exit(5)
2 голосов
/ 15 февраля 2013

Этот скрипт позволяет аутентифицированным пользователям запускать произвольный код в качестве пользователя git.

Пример использования: https://gist.github.com/ranmrdrakono/4959641
Предлагаемое исправление: https://gist.github.com/ranmrdrakono/4959672

Обратите внимание, что exec имеет два параметра. Первая - команда, которая должна быть выполнена (постоянная), а вторая - аргумент (который не будет интерпретироваться оболочкой).

2 голосов
/ 18 января 2010

Можно использовать gitosis . (хорошая статья здесь )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...