@@ -0,0 +1,138 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Forcing Use of Fossil’s RBonceBAC over SSH
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Andy Bradford posted a [clever solution][sshfc] to the problem of
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil’s RBAC system [being ignored](../../caps/#webonly) over `ssh://`
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ URLs: use OpenSSH’s `ForceCommand` feature to route the sync transfer
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ protocol data over `fossil http` rather than `fossil test-http`.
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The setup for this is complicated, but it’s a worthy option when you
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ need encrypted communications between the client and server, you already
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ have SSH set up, and [the HTTPS alternative](../../ssl.wiki) is
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unworkable for some reason.
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## 1. Force remote Fossil access through a wrapper script <a id="sshd"></a>
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Put something like the following into the `sshd_config` file on the
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil reposito ry server:
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-con-config
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Match Group fossi AllowTcpForwarding no
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AllowTcpForwarding no
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A ForceCommand /home/fossil/bin/wrapper
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This file is usually found in `/etc/ssh`, but some OSes put it
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ elsewhere.
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The first line presumes that we will put all users who need to use our
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil repositories into the `fossil` group, as we will do
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [below](#perms). You could instead say something like:
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-config
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Match User alice,bob,carol,dave
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You have to list the users allowed to use Fossil in this case because
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ your system likely has a system administrator that uses SSH for remote
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shell access, so you want to *exclude* that user from the list. For the
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ same reason, you don’t want to put the `ForceCommand` directive outside
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a `Match` block of some sort.
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You could instead list the exceptions:
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-config
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xceptions:
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-config
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Match User !edie
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This would permit only Edi
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## 2. Rewrite the sync command with that wrapper <a id="wrapper"></a>
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ When Fossil syncs over SSH, it attempts to launch a remote Fossil
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ instance with certain parameters in order to set up the HTTP-based sync
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ protocol over that SSH tunnel. We need to preserve some of this command
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and rewrite other parts to make this work.
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Here is a simpler variant of Andy’s origin #!/bin/bash
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rwarding no
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AllowTcpForwa rding no
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ForceCommand /home/foss ROOT=/home/fossil
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ home/fossil/bin/wrapper
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This file is usually found in `/etc/ssh`, but some OSes put it
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ elsewhere.
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The first line presumes that we will put all users who need to use our
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil repositories into the `fossil` group, as we will do
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [below](#perms). You could instead say something like:
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-config
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Match User alice,bob,carol,dave
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You have to list the users allowed to use Fossil in this case because
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ your system likely has a system administrator that uses SSH for remote
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shell access, so you want to *exclude* that user from the list. For the
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ same reason, you don’t want to put the `ForceCommand` directive outside
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a `Match` block of some sort.
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You could instead list the exceptions:
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-config
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Match User !evi
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This would permit only [Evi the System Administrator][evi] to bypass this
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mechanism.
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [ to bypass this
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mechanism.
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [evi]: https://en.wikipedia.org/wiki/Evi_Nemeth
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you have a user that needs both interactive SSH shell access *and*
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil access, exclude that user from the `Match` rule and use Fossil’s
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ normal `ssh://` URL scheme for those cases. This user will bypass the
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil RBAC, but they effectively have Setup capability on those
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repositories anyway by having full read/write access to the DB files via
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the shell.
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## 2. Rewrite the sync command with that wrapper <a id="HTTP-based sync
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ protocol over that SSH tunnel. We need to preserve some of this command
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and rewrite other parts to make this work.
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Here is a simpler variant of Andy’s origin #!/bin/bash
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rwarding no
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ AllowTcpForwa rding no
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ForceCommand /home/foss ROOT=/home/fossil
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ home/fossil/bin/wrapper
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This file is usually found in `/etc/ssh`, but some OSes put it
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ elsewhere.
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The first line presumes that we will put all users who need to use our
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil rep,itories intything like. wol access through a wrapper script <a id="sshd"></a>
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Put something like the e `REMOTE_USER`
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ certain conYou have to give
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the following command on each repository where you want to allow this## 4e following into the `sshd_config` file on the
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil repository server:
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ``` ssh-config
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Match Group fossil
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ X11Forwarsudo adduser fossil
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sudo adduser $u
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ done
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sudo -i -u fossil
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ chmod 710 .
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mkdir -m 750 bin
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mkdir -m 770 museum
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and [permit
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `REMOTE_USER`