-
Notifications
You must be signed in to change notification settings - Fork 136
/
Copy pathsetting-up-server.asc
149 lines (121 loc) · 8.72 KB
/
setting-up-server.asc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
[[r_setting_up_server]]
=== Настраиваем сервер
Давайте рассмотрим настройку доступа по SSH на стороне сервера.
В этом примере мы будем использовать метод `authorized_keys` для аутентификации пользователей.
Мы подразумеваем, что вы используете стандартный дистрибутив Linux типа Ubuntu.
[NOTE]
====
Вместо ручного копирования и установки открытых ключей, многое из описанного ниже может быть автоматизировано за счёт использования команды `ssh-copy-id`.
====
Для начала создадим пользователя `git` и каталог `.ssh` для этого пользователя:
[source,console]
----
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
----
Затем вам нужно добавить открытые SSH-ключи разработчиков в файл `authorized_keys` пользователя `git`.
Предположим, у вас уже есть несколько таких ключей и вы сохранили их во временные файлы.
Напомним, открытый ключ выглядит примерно так:
[source,console]
----
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
----
Вы просто добавляете их в файл `.ssh/authorized_keys` в домашнем каталоге пользователя `git`:
[source,console]
----
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
----
Теперь вы можете создать пустой репозиторий для них, запустив `git init` с параметром `--bare`, что инициализирует репозиторий без рабочего каталога:(((команды git, init, bare)))
[source,console]
----
$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/
----
После этого Джон, Джози или Джессика могут отправить первую версию их проекта в этот репозиторий, добавив его как удалённый и отправив соответствующую ветку.
Заметьте, что кто-то должен заходить на сервер и создавать голый репозиторий каждый раз, когда вы хотите добавить проект.
Пусть `gitserver` -- имя хоста сервера, на котором вы создали пользователя `git` и репозиторий.
Если он находится в вашей внутренней сети и вы создали DNS запись для `gitserver`, указывающую на этот сервер, то можно использовать следующие команды как есть (считая что `myproject` это существующий проект с файлами):
[source,console]
----
# На компьютере Джона
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master
----
Теперь все остальные могут клонировать его и отправлять в него изменения:
[source,console]
----
$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'Fix for README file'
$ git push origin master
----
Этим способом вы можете быстро получить Git-сервер с доступом на чтение/запись для небольшой группы разработчиков.
Заметьте, что теперь все эти пользователи могут заходить на сервер как пользователь `git`.
Чтобы это предотвратить, нужно изменить ему оболочку на что-то другое в файле `/etc/passwd`.
Вы можете легко ограничить пользователя `git` только действиями, связанными с Git, с помощью ограниченной оболочки `git-shell`, поставляемой вместе с Git.
Если указать её в качестве командного интерпретатора для пользователя `git`, то он не сможет получить доступ к обычной командной оболочке на вашем сервере.
Для её использования, укажите `git-shell` вместо bash или csh для пользователя `git`.
Для этого вы должны сначала добавить `git-shell` в `/etc/shells` если её там ещё нет:
[source,console]
----
$ cat /etc/shells # посмотрим, присутствует ли `git-shell`. Если нет...
$ which git-shell # проверим, что `git-shell` установлена.
$ sudo -e /etc/shells # и добавим путь к `git-shell` из предыдущей команды
----
Теперь можно изменить оболочку для пользователя используя `chsh <username> -s <shell>`:
[source,console]
----
$ sudo chsh git -s $(which git-shell)
----
Теперь пользователь `git` может использовать SSH соединение только для работы с репозиториями Git и не может зайти на машину.
Если вы попробуете войти в систему, то вход будет отклонён:
[source,console]
----
$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.
----
На текущий момент пользователи всё ещё могут использовать перенаправление порта SSH для доступа к другим Git серверам, к которым текущий может подключиться.
Если это нужно отключить, вы можете добавить следующие опции в файл `authorized_keys` перед теми ключами, для которых нужно применить это ограничение:
[source,console]
----
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
----
В результате файл будет выглядеть следующим образом:
[source,console]
----
$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...
----
Теперь сетевые команды Git будут работать, но пользователи не смогут заходить на сервер.
Вы также можете создать подкаталог в домашнем каталоге пользователя `git`, чтобы немного изменить поведение `git-shell`.
Например, вы можете ограничить команды Git, которые сервер будет принимать или сообщение, которое увидят пользователи если попробуют зайти по SSH.
Для получения дополнительной информации по настройке оболочки запустите команду `git help shell`.(((команды git, help)))