Запретить пользователю читать другие домашние каталоги и связать его с / var / www / folder

Я создал быструю HTML-форму для выполнения следующего кода.Хотя это и не полная переработка; и определенно не полный, он работает. Обратите внимание на добавление строк print $q->header(...)перед строками print $q->start_html(...). Если бы мне нужно было закончить его очистку, я бы удалил вызовы dieи заменил их чем-то похожим на то, что делается для ввода неправильного числа. В некоторых случаях вместо вызова die вы можете захотеть отправить ответ HTML-сервера об ошибке (5xx) для неудачных подключений/входов по ssh. Повторяющиеся многострочные участки кода, вероятно, следует поместить в функцию. Я также не создавал более чистый вывод HTML для часов, которые не были левымиили правыми, как я уже сказал, это не то, что я считаю полной программой. При написании CGI вам нужно осознать тот факт, что вывод на самом деле не является терминалом или консолью. Вы должны фиксировать почти все возможные сбои (логины, подключения, запросы, вывод команд и т. д.) и создавать HTML (и, возможно, обновлять заголовки, чтобы вернуться к исходной форме или другой веб-странице) соответственно.

#!/usr/bin/perl -w                                                              
#
# vi: set ft=perl syntax=perl noai ts=4 sw=4:       
use CGI qw(:standard -debug);                                                 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);                          
use Net::SSH2;                                                                
use strict;                                                                    
my $ssh2 = Net::SSH2->new();                                                    
my $q = new CGI;                                                              
my $formurl = "http://webhost.example.com/testform.html";
my $lefthost = "leftclock.example.com";
my $righthost = "rightclock.example.com";
my $publickey = "/home/user/.ssh/id_rsa2.pub";
my $privatekey = "/home/user/.ssh/id_rsa2";
my $username = "user";

my $style = get_style();                                                                                                                                  
my $guy = $q->param('number');                                                    
$guy =~ s/\D//g;                                                               
if ($guy == 0){                                                                
#    die("Please enter number for employee, broken");                     
    print $q->header( -type => "text/html", -Refresh=>"5; URL=$formurl" );
    print $q->start_html( -title => "Bad Number" );
    print $q->h2("Missing Employee Number");
    print "Please return to the the form and enter employee number<BR>\n";
    print "If you are not redirected in 5 seconds, click on the following link.<BR>\n";
    print $q->a({-href => $formurl},"$formurl");
    print $q->end_html;
    exit 0;
}

my $sides = $q->param('clock');
if ($sides ne "left" && $sides ne "right" ) {
    print $q->header( -type => "text/html", -Refresh=>"5; URL=$formurl" );
    print $q->start_html( -title => "Bad Clock" );
    print $q->h2("Incorrect Clock Chosen");
    print "Please return to the form and enter \"left\" or \"right\" for clock.<BR>\n";
    print "If you are not redirected in 5 seconds, click on the following link.<BR>\n";
    print $q->a({-href => $formurl},"$formurl");
    print $q->end_html;
    exit 0;
}

my $finger =  $q->param('finger');
#
# Add code here to validate value entered for finger
# Follow logic from $sides and $guy above
#

#
# At this point all the field values are validated and we can begin
# to process
#

print $q->header(-type => "text/html" );

print $q->start_html(
-title => "Enroll Finger Print",
-style => {-code => $style},
);
print $q->h2("Enrolling Finger...");
if ($sides eq "left"){
    $ssh2->connect($lefthost) or die;
    if (! $ssh2->auth_publickey($username, $publickey, $privatekey, undef)) {
        print $ssh2->error;
    }
    my $chan = $ssh2->channel;

    $chan->exec("fprintd-enroll  -f ${finger} ${guy}");
    $chan->send_eof;
    while (<$chan>) {
        chomp;
        print "line read: $_</BR>\n";
    }

    $chan->close;

    $ssh2->disconnect();
    print $q->h2("Sent request for " . $guy . "'s " . "$finger");
    print $q->end_html;
    exit 0;
}

if ($sides eq "right"){
    $ssh2->connect($righthost) or die;
    if (! $ssh2->auth_publickey($username, $publickey, $privatekey, undef)) {
        print $ssh2->error;
    }
    my $chan = $ssh2->channel;

    $chan->exec("fprintd-enroll  -f ${finger} ${guy}");
    $chan->send_eof;
    while (<$chan>) {
        chomp;
        print "line read: $_</BR>\n";
    }

    $chan->close;

    $ssh2->disconnect();
    print $q->h2("Sent request for " . $guy . "'s " . "$finger");
    print $q->end_html;
    exit 0;
}
else{
print $q->h4("Timeclock not selected\n");
print $q->h4("Please select a timeclock to use for finger enrollment.");
exit 1;
}

## Subs

sub get_style {
my $style = <<"EOT";
body {
font-family: verdana, arial, sans-serif;
bgcolor: white;
padding-left: 5%;
}
h2 {
colors: purple;
border-bottom: 1pt solid;
}
h4 {
color: blue;
}
EOT
return $style;
}
1
26.03.2017, 14:52
1 ответ

Пользователю test нужна домашняя папка для хранения файлов конфигурации (пример: /home/test/.bashrc, который является файлом конфигурации bash)
Что вы можете сделать, так это сделать его владельцем каталога в /var/www, и он будет единственным, кто сможет получить к нему доступ.

chown -R test /var/www/target-dir

Вы можете сделать ссылку из /var/www в его домашнюю папку.

ln -s /var/www/target-dir /home/test/

Затем, если он подключится через ftp/sftp/ssh, он войдет в каталог /home/test, содержащий ссылку на папку, которую он может изменить.

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

chmod o-x /home/other_user
1
28.01.2020, 00:59

Теги

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