2010-01-18 18 views
8

Estamos usando git-shell para asegurarnos de que la cuenta de git solo se use para operaciones de git. Esto funciona genialUsando git-shell y restringiendo a los desarrolladores a comprometerse con sus propios proyectos

Sin embargo, antes de pasar a usar git a tiempo completo, ¿cómo lo configuramos de manera similar a github por lo que dependiendo de su clave pública solo puede comprometerse con sus propios repositorios?

Por lo que yo puedo decir a la gente de GitHub pueden rodando su propio git-shell, la source code appears to be very simple to hack

Respuesta

14

utilizo algo un poco más simple, todo lo que necesita es configurar tres archivos, el archivo, el archivo authorized_keysgitsecurity.rb y presentar una gitpermissions permisos. Para simplificar, todos pueden ir a la carpeta .ssh de cuentas git. (Básico UNIX habilidades de administración necesarias para entender el presente documento)

El archivo gitpermissions se parece a esto, y debe ser bastante auto explanitory:

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

El archivo autorized_keys se ve algo como esto:

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 

Finalmente, el script gitsecurity.rb, simplemente cópielo y péguelo:

#!/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) 
+0

Eso es genial, eso es exactamente lo que yo buscaba, simple, rápido y fácil. ¡Gracias! – corydoras

2

Una opción podría ser el uso de gitosis. (Agradable relato here)

+0

Gitosis es genial, siempre y cuando tengas acceso para instalar en las ubicaciones de python correctas, de lo contrario, es una pesadilla. – Jacob

Cuestiones relacionadas