SFTPを使用して、root権限が必要なファイルを編集できるようにしたい。
SSHキーベースの認証を使用しています-スマートカードのrsaキー。
システムがルートレベルのコマンドを実行するためにSudoを必要とする場合、どうすればこれを回避できますか?
SFTPのみのSudoをバイパスする方法を作成できますか?
Sudoとキー認証を維持する方法はありますか?.
Windowsを使用してUbuntuに接続しています。 Ubuntuに接続するMacでも同様にこれが必要です。
SSHトンネリングを実行してシステムサービスを管理する方法を理解しています。現在、rootユーザーのログインを直接使用していますが、パスワードによるログインは無効になっています。 SudoとSFTPを同時に使用する方法がわかりませんでした。ログには各コマンドのエスカレートされた権限が付与されたユーザーが記録されるため、非rootユーザーとしてのログインを要求し、次にSudoの使用を要求することがベストプラクティスのようです。
鍵ベースの認証を使用する場合、これに注意する必要がありますか、それともセキュリティ/ログ記録のわずかな違いですか?キーベースの認証では、ユーザーのシリアル番号がログに記録されるようで、ルートユーザーが複数のキーを使用して各ユーザーを識別できます。これは私にSudoを使用するのと同じ効果のようです。私が間違っている?
SFTPは、ファイル操作へのコマンドアクセスであり、使用するアカウントの制限があります。より多くの管理操作を行うにはsshを使用する必要があり、SudoとSFTPを同時に使用することは不可能です。 SFTPを使用して制限なしにディスク全体にアクセスする必要がある場合は、rootアカウントを使用してアクセスします。とにかく、もちろん2つの異なるセッションを使用して、sftpとsshにrootでログインできます。
セキュリティキーはセキュリティを向上させ、ロギングをより簡単にします。キーボード入力は必要ありません。ログインを助けるだけで、あなたはすべてのアカウントユーザーのためにいくつかのパスワードを持つことができ、同じ効果がありました。
編集:忘れました:ユーザーIDを0に割り当てた場合、rootと同じ効果を持つ別のアカウントを作成できますが、意味がなく、同じように危険です。 rootのようにログインしようとすると難読化する可能性がありますが、それ以外はあまり意味がありませんでした。
Sudoを使用してサブシステムを呼び出すと、うまくいきました。
たとえば、Ubuntuホストへ:
sftp -s "Sudo /usr/lib/openssh/sftp-server" targethost.fqdn
上記のコメントで @ MartinVonWittichが提案したもの を超えて、このアクティビティのために専用のSSHキーペアをセットアップし、それらをrootユーザーの/root/.ssh/authorized_keys
ファイルに追加して、スコープを制限できます。たった1つのコマンド。
# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@Host
これにより、このペアに対応するキーを持つ別のシステムが、ルートとしてこのシステムにSFTPで接続できるようになります。 syslog
ファイルまたはsecure.log
ファイル、あるいはその両方にこの接続の記録が残っています(ディストリビューションがこのレベルのログを提供している場合)。
注:この方法でサーバーにアクセスするユーザーは誰でもCartes Blancheにアクセスできるため、賢く使用してください。読み取りを続行し、この機能をchrootおよび読み取り専用アクセスと組み合わせて、より厳密な制限と特定の場所へのターゲットアクセスをrootとして構築します。
ここで利用できるもう1つの手法は、SFTP接続を制限して、使用されたSSHキーに基づいて、ルートとして特定の場所にchrootされるようにすることです。詳細については、このU&L Q&Aへの私の回答を参照してください:「 SFTPを使用したパスワードなしのバックアップの制限 」。
スイッチsftp-server
および-R
を使用して-d
を制御することもできます。
-d start_directory
specifies an alternate starting directory for users. The pathname
may contain the following tokens that are expanded at runtime: %%
is replaced by a literal '%', %h is replaced by the home directory
of the user being authenticated, and %u is replaced by the user‐
name of that user. The default is to use the user's home
directory. This option is useful in conjunction with the
sshd_config(5) ChrootDirectory option.
-R Places this instance of sftp-server into a read-only mode.
Attempts to open files for writing, as well as other operations
that change the state of the filesystem, will be denied.
私が従った単純なアプローチは、sftpを実行してファイルをステージ領域(mkdir
サーバー上のアクセス許可がある新しいディレクトリ)に配置し、もう一度sshを実行して、ファイルをそこからSudo cp
またはSudo mv
で宛先に移動することでした。
(s)ftpの代わりにscpを使用し、WinSCPでシェルをSudo su -
に変更します。これはAdvanced\SCP\Shellにありますが、これはonlyがscpプロトコルで機能します。
WinSCPおよびAmazon EC2 Ubuntu固有の回答:
2019年11月のAWS EC2 Ubuntu 18.04サーバーAMIの場合、デフォルトのubuntu
ユーザーはパスワードなしのSudo用にすでに設定されています。小切手 /etc/sudoers.d/90-cloud-init-users
、(私の場合):
# Created by cloud-init v. 19.2-36-g059d049c-0ubuntu1~18.04.1 on Wed, 27 Nov 2019 09:23:42 +0000
# User rules for ubuntu
ubuntu ALL=(ALL) NOPASSWD:ALL
WinSCPの場合、サイトの詳細設定を次のように変更します。
Sudo /usr/lib/openssh/sftp-server
(私の意見では、推奨されるドロップダウンオプションの1つである必要があります)
私は同様の問題を抱えていましたが、vimdiffを使用して、cssとSudoを使用して、ほとんど同じようなホストのグループの構成ファイルを編集したいと思います。私のソリューションをワークフローに適合させることができるかもしれません。
sudoedit(Sudoの一部)を使用すると、任意のエディターを通常のユーザーとして使用して、書き込み権限のないファイルを編集したり、環境変数でエディターを指定したりできます。 sudoeditはファイルをコピーし、コピーの名前を使用してエディターを呼び出し、エディターが終了するのを待ってから、変更されたコピーを元の場所にコピーします。そのため、編集しない「エディター」を作成しました。後で使用するためにファイルをメモし、そのマーカーを使用するvimdiffのラッパーを待機します。
最初のファイルは〜/ .bin/reditです
#!/usr/bin/Perl -w
use strict;
use warnings;
use Sys::Hostname;
my $file = $ENV{HOME}.'/.var/redit/'.hostname();
sub cmkdir($){
my $_=shift;
mkdir $_ unless -d $_;
}
cmkdir $ENV{HOME}.'/.var/';
cmkdir $ENV{HOME}.'/.var/redit/';
foreach (@ARGV){
my $fh;
open $fh, '>', $file.'na' or warn;
print {$fh} $_;
close $fh;
symlink $_, $file or die;
print;
<STDIN>;
unlink $file or die;
unlink $file.'na' or die;
}
2番目は〜/ .bin/redit1です
#!/usr/bin/Perl -w
use strict;
use warnings;
use Sys::Hostname;
my $h=hostname();
@ARGV=qw(Host1 Host2 Host3 Host4) unless @ARGV;
print join " ", qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
exec qw(gvimdiff), $ENV{HOME}.'/.var/redit/'.$h, map {'scp://'.$_.'/.var/redit/'.$_} grep {$_ ne $h} @ARGV;
それらを使用する方法は、csshを使用して4つすべてのホストへの接続を開き、EDITOR=~/.bin/redit sudoedit /etc/conf/file
のようなコマンドを使用してから、別のウィンドウで~/.bin/redit1
を実行し、変更を加えて、保存して終了し、切り替えるcsshに戻り、Enterキーを押して変更をコミットし、sudoeditを終了します(複数のファイルを編集している場合を除きます。この場合、reditはリストの次のファイルに進み、次のファイルに対してredit1を再度実行します)。
リモートホストは1つだけなので、reit1は必要ないので、複雑ではありません。sftpエディターでHost:.var/redit/Hostまたは同等のものを指定するだけです。
Sftpの場合:ssh Shell Sudoアクセス権がある場合は、ユーザー名を/ etc/groupのルートユーザーグループに追加し、アクセスしたいフォルダーにそのグループにrx権限を付与できます。
サーバー側のsshd_configファイルに挿入できます。
Subsystem sftp Sudo -n true && Sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server
このようにして、NOPASSWD Sudo権限を持つユーザーは、ルート化されたsftpアクセスを取得します。
この行を/ etc/ssh/sshd_configに追加することは私にとっての修正であり、既存のサブシステム行Subsystem sftp Sudo -n true && Sudo -n /usr/lib/openssh/sftp-server || /usr/lib/openssh/sftp-server
をコメント化しました
次にSudo systemctl sshd restart