Как ChrootDirectory и домашний каталог пользователя работают вместе?

perl -MFatal='open,close' -ali -ne '
   BEGIN{
      open FILEC, ">", "FileC.out";
      open FILED, ">", "FileD.out";
   }

   if ( @ARGV ) { # FileB readin
      if ( $. == 1 ) {
         push @names, @F;
         print FILED $_;
      } else {
         push @A, join $/, @F;
         push @B, $_;
      }
      print;
   } else { # FileA readin
      if ( $. == 1 ) {
         print FILEC $_;
         print;
         @remap =
            map {
               my $n = $names[$_];
               grep { $n eq $F[$_] } 0.. $#F;
            } 0..$#names;
      } else {
         my $n = join $/, @F[@remap];
         if ( my($id) = grep { $n eq $A[$_] } 0.. $#A ) {
            push @IDs, $id;
            print FILEC $_;
         } else {
            print;
         }
      }
   }

   eof and $. = 0;

   END{
      splice(@B, $_, 1) for @IDs;
      @B and print FILED $_ for @B;
      close $_ for *FILEC, *FILED;
   }
' FileB FileA

После этого создаются файлы "FileC.out" и "FileD.out". FileA изменяется, а FileB остается неизменным.

Поток точно такой же, как и в предыдущем запросе, добавлена ​​полевая обработка.

2
18.09.2019, 19:06
1 ответ

Вам необходимо обратить внимание на другое ограничение, наложенное на каталог, используемый какChrootDirectory:Все компоненты пути должны принадлежать root -каталогам, недоступным для записи другим пользователям или группам. Если пользователю необходимо иметь возможность записи в свой собственный домашний каталог внутри chroot, то домашний каталог не должен совпадать с ChrootDirectory.

Историческая справка:

Поддержка chroot в OpenSSH возникла как отдельный патч, и даже после того, как он был интегрирован в основной дистрибутив OpenSSH, точные требования, предъявляемые к каталогу, используемому в качестве ChrootDirectory, изменились в разных версиях OpenSSH. В более новых версиях, как правило, предъявляются более строгие требования, чем в старых, в ответ на обнаруженные уязвимости безопасности в предыдущих установках -.

Кроме того, требование иметь один и тот же путь к домашнему каталогу, применимый как внутри, так и вне chroot, явно неоптимально, и в некоторых дистрибутивах применяются исправления для изменения поведения. К сожалению, не все такие исправления в прошлом включали обновления справочных страниц и другой соответствующей документации.

Но чтобы удовлетворить требования, как написано, вы могли бы сделать это, например:

mkdir -p /jail/username/home

# First, the chroot directory:
chown root:root /jail/username
chmod 755 /jail/username

# Then, the user's home directory:
chown username: /jail/username/home
chmod 750 /jail/username/home
usermod -d /jail/username/home username

# And here's the magic:
cd /jail/username
ln -s. jail       # this would normally be a silly thing to do
ln -s. username   # but with chroot it can be useful

Теперь мы можем установить ChrootDirectory /jail/%u.

При просмотре вне chroot домашний каталог пользователя будет /jail/username/home. Немного отклонение от обычного соглашения об именах, но в остальном ничего особенного.

И внутри chroot один и тот же путь к домашнему каталогу действительно будет ссылаться на /jail/username/jail/username/home... но вы видели эти две глупые символические ссылки выше? Разыменуйте их, и вы получите /jail/username/././home, что в конечном итоге будет точно таким же, как /jail/username/home. Таким образом, один и тот же путь указывает на одно и то же место как внутри, так и снаружи chroot.

Пользователь внутри chroot увидит свой домашний каталог как /jail/username/home= /././home= /homeи сможет использовать его как обычно.Они смогут видеть на один уровень выше своего домашнего каталога, /, но писать туда сможет только root.

Это также позволит вести журнал в стиле syslog -:, вы можете создать корневой -собственный каталог /jail/username/devи указать rsyslogсоздать дополнительный сокет в стиле/dev/log/jail/username/dev/log... и теперь chroot-пользователь может создавать сообщения журнала и обрабатывать их обычной подсистемой syslog.

Это ни в коем случае не единственный способ упорядочить окружение chroot, хотя описанная выше -настройка стиля делает домашний каталог пользователя обычным (= без символических ссылок и других странностей ), насколько это возможно для процессов вне среды chroot, если это важно.

Если вместо этого вы хотите, чтобы chroot был максимально стерильным для заключенного в тюрьму пользователя, вы можете сделать это вместо этого:

mkdir -p /jail/username/username

# Prepare the chroot directory
chown root:root /jail /jail/username
chmod 755 /jail /jail/username

# Prepare the user's actual home directory
chown username: /jail/username/username
chmod 750 /jail/username/username

# Make it usable outside the chroot too
ln -s /jail/username/username /username

# And now it can be assigned to the user.
usermod -d /username username

Снова устанавливаем ChrootDirectory /jail/%u.

Вне chroot /usernameбудет символической ссылкой, указывающей на /jail/username/username, поэтому домашний каталог пользователя будет действительным.

Для chroot-процессов /usernameбудет обычным каталогом, который можно использовать в качестве домашнего каталога пользователя.

Да, настоящие пути немного повторяются, а символические ссылки будут загромождать корневую директорию системы, но в среде chroot не будет ничего постороннего.

И если единственное то, что нужно chroot-пользователю, — это SFTP, принятый ответ на этот вопрос описывает еще более простой способ.

3
27.01.2020, 22:16

Теги

Похожие вопросы