diff options
Diffstat (limited to 'perl-install/security/msec.pm')
| -rw-r--r-- | perl-install/security/msec.pm | 122 |
1 files changed, 57 insertions, 65 deletions
diff --git a/perl-install/security/msec.pm b/perl-install/security/msec.pm index dba674932..4258653ef 100644 --- a/perl-install/security/msec.pm +++ b/perl-install/security/msec.pm @@ -1,22 +1,10 @@ package security::msec; use strict; -use MDK::Common::File; use MDK::Common; #------------------------------------------------------------- -# msec files - -my $check_file = "$::prefix/etc/security/msec/security.conf"; -my $curr_sec_file = "$::prefix/var/lib/msec/security.conf"; -my $options_file = "$::prefix/etc/security/msec/level.local"; - - -my $num_level; - - -#------------------------------------------------------------- # msec options managment methods @@ -24,24 +12,13 @@ my $num_level; # option defaults sub load_defaults { - my ($category) = @_; - my $default_file; - my $num_level = 0; - - if ($category eq 'functions') { - require security::level; - $num_level ||= security::level::get(); - $default_file = "$::prefix/usr/share/msec/level.".$num_level; - } - elsif ($category eq 'checks') { $default_file = $curr_sec_file } - - my $separator = $category eq 'functions' ? ' ' : $category eq 'checks' ? '=' : undef; - do { print "BACKTRACE:\n", backtrace(), "\n"; die 'wrong category' } unless $separator; + my ($msec, $category) = @_; + my $separator = $msec->{$category}{def_separator}; map { - my ($opt, $val) = split /$separator/; + my ($opt, $val) = split(/$separator/, $_, 2); chop $val; if_($opt ne 'set_security_conf', $opt => $val); - } cat_($default_file); + } cat_($msec->{$category}{defaults_file}), if_($category eq "checks", 'MAIL_USER'); } @@ -64,50 +41,48 @@ sub get_function_default { # option values sub load_values { - my ($category) = @_; - my $item_file = - $category eq 'functions' ? $options_file : - $category eq 'checks' ? $check_file : ''; - - my $separator = $category eq 'functions' ? '\(' : $category eq 'checks' ? '=' : undef; - do { print "BACKTRACE:\n", backtrace(), "\n"; die 'wrong category' } unless $separator; + my ($msec, $category) = @_; + my $separator = $msec->{$category}{val_separator}; map { my ($opt, $val) = split /$separator/; chop $val; $val =~ s/[()]//g; chop $opt if $separator eq '\('; # $opt =~ s/ //g if $separator eq '\('; - $opt => $val; - } cat_($item_file); + if_(defined($val), $opt => $val); + } cat_($msec->{$category}{values_file}); } -# get_XXX_value(function) - +# get_XXX_value(check|function) - # return the value of the function|check passed in argument. # If no value is set, return "default". sub get_function_value { my ($msec, $function) = @_; - $msec->{functions}{value}{$function} || "default"; + exists $msec->{functions}{value}{$function} ? $msec->{functions}{value}{$function} : "default"; } sub get_check_value { my ($msec, $check) = @_; -# print "value for '$check' is '$msec->{checks}{value}{$check}'\n"; $msec->{checks}{value}{$check} || "default"; } - #------------------------------------------------------------- -# get list of functions +# get list of check|functions # list_(functions|checks) - # return a list of functions|checks handled by level.local|security.conf +sub raw_checks_list { + my ($msec) = @_; + keys %{$msec->{checks}{default}}; +} + sub list_checks { my ($msec) = @_; - map { if_(!member($_, qw(MAIL_WARN MAIL_USER)), $_) } keys %{$msec->{checks}{default}}; + difference2([ $msec->raw_checks_list ], [ qw(MAIL_WARN MAIL_USER) ]); } sub list_functions { @@ -122,7 +97,7 @@ sub list_functions { enable_dns_spoofing_protection enable_ip_spoofing_protection enable_log_strange_packets enable_promisc_check no_password_aging_for)], 'system' => [qw(allow_autologin allow_issues allow_reboot allow_remote_root_login - allow_root_login allow_user_list allow_x_connections allow_xserver_to_listen + allow_root_login allow_user_list allow_xauth_from_root allow_x_connections allow_xserver_to_listen authorize_services enable_at_crontab enable_console_log enable_msec_cron enable_pam_wheel_for_su enable_password enable_security_check enable_sulogin password_aging password_history password_length set_root_umask @@ -130,7 +105,7 @@ sub list_functions { # get all function names; filter out those which are in the ignore # list, return what lefts. - map { if_(!member($_, @ignore_list) && member($_, @{$options{$category}}), $_) } keys %{$msec->{functions}{default}}; + grep { !member($_, @ignore_list) && member($_, @{$options{$category}}) } keys %{$msec->{functions}{default}}; } @@ -156,40 +131,57 @@ sub set_check { sub apply_functions { my ($msec) = @_; - my @list = ($msec->list_functions('system'), $msec->list_functions('network')); + my @list = sort($msec->list_functions('system'), $msec->list_functions('network')); + touch($msec->{functions}{values_file}) if !-e $msec->{functions}{values_file}; substInFile { foreach my $function (@list) { s/^$function.*\n// } if (eof) { - print "\n", join("\n", map { + $_ .= join("\n", if_(!$_, ''), (map { my $value = $msec->get_function_value($_); if_($value ne 'default', "$_ ($value)"); - } @list); + } @list), ""); } - } $options_file; + } $msec->{functions}{values_file}; } sub apply_checks { my ($msec) = @_; - my @list = $msec->list_checks; - substInFile { - foreach my $check (@list) { s/^$check.*\n// } - if (eof) { - print "\n", join("\n", map { - my $value = $msec->get_check_value($_); - if_($value ne 'default', $_ . '=' . $value); - } @list), "\n"; - } - } $check_file; + my @list = sort $msec->raw_checks_list; + setVarsInSh($msec->{checks}{values_file}, + { + map { + my $value = $msec->get_check_value($_); + if_($value ne 'default', $_ => $value); + } @list + } + ); +} + +sub reload { + my ($msec) = @_; + require security::level; + my $num_level = security::level::get(); + $msec->{functions}{defaults_file} = "$::prefix/usr/share/msec/level.$num_level"; + $msec->{functions}{default} = { $msec->load_defaults('functions') }; } sub new { - my $type = shift; - my $thing = {}; - $thing->{checks}{default} = { load_defaults('checks') }; - $thing->{functions}{default} = { load_defaults('functions') }; - $thing->{functions}{value} = { load_values('functions') }; - $thing->{checks}{value} = { load_values('checks') }; - bless $thing, $type; + my ($type) = @_; + my $msec = bless {}, $type; + + $msec->{functions}{values_file} = "$::prefix/etc/security/msec/level.local"; + $msec->{checks}{values_file} = "$::prefix/etc/security/msec/security.conf"; + $msec->{checks}{defaults_file} = "$::prefix/var/lib/msec/security.conf"; + $msec->{checks}{val_separator} = '='; + $msec->{functions}{val_separator} = '\('; + $msec->{checks}{def_separator} = '='; + $msec->{functions}{def_separator} = ' '; + $msec->reload; + + $msec->{checks}{default} = { $msec->load_defaults('checks') }; + $msec->{functions}{value} = { $msec->load_values('functions') }; + $msec->{checks}{value} = { $msec->load_values('checks') }; + $msec; } 1; |
