cp では権限例外が発生しないのに、なぜ shutil.copy() では権限例外が発生するのでしょうか? 質問する
shutil.copy() が権限エラーを発生させています: Traceback (most recent call last):
File "copy-test.py", line 3, in
shutil.copy() が権限エラーを発生させています: Traceback (most recent call last):
File "copy-test.py", line 3, in
閉鎖。質問は〜です。無関係。現時点では回答は許可されていません。 問題の説明再現できない問題自然に消えているように見える(またはスペルエラーが修正された後に消える)記事は、将来の読者には役に立たない可能性が高いため、トピックから抜け出した記事です。 閉鎖昨日。 この問題を改善する 概要:あるフォルダから別のフォルダにファイルを移動すると、保存先フォルダの実行可能プロパティが失われ、そのフォルダとそのコンテンツにアクセスできなくなります。 [元のStack Overflowに投稿されましたが、プログラミングの質問ではなくUnixとLinuxに再公開されました。] サブフォルダがあり、親フォルダでドキュメントを処理した後、私のアプリケーション(Laravel、しかし問題は関係がないようです)は、このドキュメントをサブフォルダに移動する必要があります。ドキュメントを親フォルダからサブフォルダに移動すると、サブフォルダは「x」実行可能属性を失い、「drwxrwx---」から「drw-rw----」に変更されます。これによりコンテンツにアクセスできなくなり、将来の方向に移動できなくなります。子ファイルのファイルを一覧表示しようとすると、各ファイルに対して「ls:Access Denied」が報告され、その属性は「-?????????」と表示されます。 以下に、前後のソースディレクトリとターゲットサブディレクトリを示します。 # Source Before
drwxrwx---. 3 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 4096 Apr 11 13:42 dmarc_reports
# Source After
drwxrwx---. 3 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 4096 Apr 11 13:42 dmarc_reports
# Destination Before
drwxrwx---. 2 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 6 Apr 11 07:56 processed
# Destination After
drw-rw----. 2 openapp nginx unconfined_u:object_r:httpd_sys_rw_content_t:s0 6 Apr 11 13:42 processed
「chmod ug + xfolder_name」を使用してアクセス権をリセットすると、ファイルに再度アクセスできますが、別のファイル移動操作を実行すると問題が再発生します。実行が移動する方向、コードで実行するのか、シェルで mv を使用しているかにかかわらず、問題が発生します。これは、SELinuxを無効にして(setenforce 0を使用)、fapolicydを停止した場合にも発生します。 すべてのファイルとフォルダは、私のユーザーとアプリケーションとユーザーが属するnginxグループによって所有されています。ターゲットはソースのサブフォルダなので、同じファイルシステムにあります。 これは私を完全に混乱させました。 CentOS Stream 9を実行しています。前述のようにSELinuxの問題を解決しましたが、参考までにすべてのファイルには「system_u:object_r:httpd_sys_rw_content_t:s0」コンテキストがあり、フォルダには「unconfined_u:object_r:httpd_sys_rw_content_t:」コンテキストがあります。 どんなアイデアがありますか? 関連する場合、最初から(つまり、権限が変更された後)失敗したコード/コマンドは次のようになります。 // Laravel Instruction
Storage::move($fileLocation, $dest)
// Native PHP Instruction
rename(Storage::path($fileLocation), Storage::path($dest))
## Bash Instruction
mv <
ファイアウォールの実装の一部として、次のように定義された属性を使用してsysfsデバイスを実装しています。 #define FILE_PERMISSIONS S_IWUSR | S_IRUGO static DEVICE_ATTR(sysfs_att, FILE_PERMISSIONS, display, modify); ファイルの読み込みに問題はありません。 cat /sys/class/secws_class/secws_class_secws_device/sysfs_att ただし、変更(保存)操作をサポートしているため、次のコマンドを使用してデバイスと対話する予定です。 echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att しかし、これにより -bash: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Permission denied sudoで使用している場合でもこれが発生しますtee。また、sysファイルに正しい権限があり、ユーザーへの書き込み権限があることも確認しました。 既に試した以外に、この問題を処理する新しい方法が見つかりません。もしかしたらアイデアはありますか? 編集:あなたの要求に応じて、ログは次のようになります。 fw@fw-VirtualBox:~/HW2$ make make -C /lib/modules/4.15.0-118-generic/build M=/home/fw/HW2 modules make[1]: Entering directory '/usr/src/linux-headers-4.15.0-118-generic' LD [M] /home/fw/HW2/hw2secws.o Building modules, stage 2. MODPOST 1 modules LD [M] /home/fw/HW2/hw2secws.ko make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-118-generic' fw@fw-VirtualBox:~/HW2$ sudo insmod hw2secws.ko fw@fw-VirtualBox:~/HW2$ cat /sys/class/secws_class/secws_class_secws_device/sysfs_att 358310 fw@fw-VirtualBox:~/HW2$ echo "0" | sudo tee /sys/class/secws_class/secws_class_secws_device/sysfs_att 0 tee: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Operation not permitted fw@fw-VirtualBox:~/HW2$ echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att -bash: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Permission denied fw@fw-VirtualBox:~/HW2$ ls -l /sys/class/secws_class/secws_class_secws_device/sysfs_att -rw-r--r-- 1 root root 4096 נוב 8 21:25 /sys/class/secws_class/secws_class_secws_device/sysfs_att fw@fw-VirtualBox:~/HW2$ sudo chown fw /sys/class/secws_class/secws_class_secws_device/sysfs_att fw@fw-VirtualBox:~/HW2$ ls -l /sys/class/secws_class/secws_class_secws_device/sysfs_att -rw-r--r-- 1 fw root 4096 נוב 8 21:25 /sys/class/secws_class/secws_class_secws_device/sysfs_att fw@fw-VirtualBox:~/HW2$ echo "0" | sudo tee /sys/class/secws_class/secws_class_secws_device/sysfs_att 0 tee: /sys/class/secws_class/secws_class_secws_device/sysfs_att: Operation not permitted fw@fw-VirtualBox:~/HW2$ echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att -bash: echo: write error: Operation not permitted そしてMRE: static int major_number; static struct class* sysfs_class = NULL; static struct device* sysfs_device = NULL; static struct file_operations fops = { .owner = THIS_MODULE } ssize_t display(struct device *dev, struct device_attribute *attr, char *buf){ ... } ssize_t modify(struct device *dev, struct device_attribute *attr, const char *buff, size_t data_size) { ... } #define FILE_PERMISSIONS S_IWUSR | S_IRUGO static DEVICE_ATTR(sysfs_att, FILE_PERMISSIONS, display, modify); int init_sysfs_module(void){ /* Register Char-Device */ major_number = register_chrdev(0, CHRDEV_NAME, &fops);\ if (major_number < 0) return -1; /* Create Sysfs-Class */ sysfs_class = class_create(THIS_MODULE, CLASS_NAME); if (IS_ERR(sysfs_class)) { unregister_chrdev(major_number, CHRDEV_NAME); return -1; } /* Link DEVICE_NAME to sysfs_class */ sysfs_device = device_create(sysfs_class, NULL, MKDEV(major_number, 0), NULL, DEVICE_NAME); if (IS_ERR(sysfs_device)) { class_destroy(sysfs_class); unregister_chrdev(major_number, CHRDEV_NAME); return -1; } /* Modify the device to use defined show/store methods */ if (device_create_file(sysfs_device, (const struct device_attribute *)&dev_attr_sysfs_att.attr)) { device_destroy(sysfs_class, MKDEV(major_number, 0)); class_destroy(sysfs_class); unregister_chrdev(major_number, CHRDEV_NAME); return -1; } return 0; } void deinit_sysfs_module(void){ device_remove_file(sysfs_device, (const struct device_attribute *)&dev_attr_sysfs_att.attr); device_destroy(sysfs_class, MKDEV(major_number, 0)); class_destroy(sysfs_class); unregister_chrdev(major_number, CHRDEV_NAME); } static int __init module_init_function(void) { init_sysfs_module(); HANDLE_NF_HOOKS(REGISTER_NF_HOOKS); return 0; } static void __exit module_exit_function(void) { deinit_sysfs_module(); HANDLE_NF_HOOKS(CLEAR_NF_HOOKS); } module_init(module_init_function); module_exit(module_exit_function); 編集2:私も次のことを試しました。 fw@fw-VirtualVox:~/HW2$ sudo su - root@fw-VirtualBox:~# echo "0" > /sys/class/secws_class/secws_class_secws_device/sysfs_att -sw: echo: write error: Operation not permitted
uid:gid(999:999) が必要なため、RabbitMQ docker コンテナーの実行に問題がありますが、慢性 NTP サービスは既にその gid(999) で実行されており、競合があります。 タイミング目的で/etc/passwdファイルのgidを変更できますか?どのような影響を与えますか?
私はサーバー上で作業しており、現在のユーザー(group = domainusers gid = 1002)は自分のファイルを読み取り、書き込み、実行できます。私の権限タイプのため実行できません。apt | adduser | addgroup | groupmod 実行する以外にchmod -R 777 /home/$USER/targetfolder必要なものを得る方法はありますか?私のパートナーをフォルダの共同所有権として追加し、実行する方法があるかどうか疑問に思います。chmod -R 770 /home/$USER/targetfolder PS:Solaris SunOs 5.10(もう少し使用されていないことを知っています。私のせいではありません) 編集:私とパートナーのための共有スペースを提供するソリューションを用意しました。 宛先フォルダへのシンボリックリンクを作成し、親フォルダの権限に関係なく読み取り、書き込み、実行権限を付与します。安全ではないことはわかりますが、私が探しているものに効果があり、残念ながら他に何もすることはできません。
一般ユーザーとしてファイルを作成しますtestuser。 $ cat > /tmp/zz 予想通り、このユーザーはファイルを所有しています。 $ ls -lA /tmp/zz -rw------- 1 testuser testuser 0 Feb 20 15:32 zz これで、次のように切り捨てようとするとroot権限が拒否されました。 # truncate --size=0 /tmp/zz truncate: cannot open '/tmp/zz' for writing: Permission denied を使用しようとすると、strace次のようになります。 openat(AT_FDCWD, "/tmp/zz", O_WRONLY|O_CREAT|O_NONBLOCK, 0666) = -1 EACCES (Permission denied) write(2, "truncate: ", 10truncate: ) = 10 write(2, "cannot open '/tmp/zz' for writin"..., 33cannot open '/tmp/zz' for writing) = 33 ... write(2, ": Permission denied", 19: Permission denied) = 19 write(2, "\n", 1 ルートにこのファイルに書き込む権限がないのはなぜですか?ルートはファイルを削除できますが、書き込むことはできません。
私が知っている限り、私たちは「umask」を使ってさまざまなセキュリティレベルを設定します。 マスク値 セキュリティレベル 有効なアクセス許可(ディレクトリ) 022 龍仁 755話 026 簡単 751話 027 簡単 750 077 深刻な 700 umaskを028「7」より大きい数値を含むように別の値に設定できますか?
/tmpフォルダには、次のすべての権限があります。 drwxrwxrwt 28 root root 20480 Jan 24 03:14 /tmp ファイルは/tmp/test.txtすでに存在し、権限666を持ち、ユーザーが所有していますtest1。 -rw-rw-rw- 1 test1 test1 0 Jan 24 02:34 /tmp/test.txt test2私はユーザーとしてecho hello >> /tmp/test.txt bash: /tmp/test.txt: Permission denied に切り替えてもrootファイルに追加できません。許可ビットに関係なく、ファイルの所有者だけがこの/tmp内容を変更できるようです。 仮想化: vmware OS: Ubuntu 20.04.3 LTS カーネル: Linux 5.13.0-27-generic アーキテクチャ: x86-64
secretinfo.txtディレクトリ内のファイルを編集しようとしています。SensitiveData 現在のディレクトリとファイルには、次の権限があります。 drwx------ 2 www-data root 4096 Apr 20 17:39 SensitiveData -rw------- 1 www-data root 28 Apr 20 17:20 secretinfo.txt ファイルとディレクトリは、コマンドインジェクション攻撃に脆弱なApache Webサーバーを実行しているUbuntuVMにあり(これは私が練習しているプライベートVMです)、コマンドcat /var/SensitiveData/secretinfo.txt出力を注入できましたMy bank account pin is 4565。同じコマンド注入技術を使用してピンを変更してみましたが、成功しませんでした。これまで、次のコマンドを試しましたが、テキストファイルは変更されません。 sed -i ‘s/4565/1111/’ /var/SensitiveData/secretinfo.txt cat /var/SensitiveData/secretinfo.txt | sed -i ‘s/4565/1111/’ > /var/SensitiveData/secretinfo.txt sedを使用すると何か抜けましたか?それとも別のコマンドを使用してテキストを置き換える必要がありますか?最初のコマンドは何もしませんが、2番目のコマンドは空のファイルを上書きして作成します。
可能な値はSharedAccessBlobPermissionsは: なし (0) 読む (1) 書く (2) 削除 (4) リスト (8) 追加 (16) 作成 (32) AddとCreateの違いは何ですかWrite? これを明確に説明するドキュメントが見つかりません。
私はLinux権限がどのように機能するか(既存のUnix DAC権限と表示方法、プロセス関連のセキュリティコンテキスト(資格情報構造、機能など)、LSMフックなど)について比較的よく理解しています。 (E)UID / E(GID)などへのリンク私が理解しておらず、カーネルコードで見つけるのが難しいのは、ftrace(pass trace-cmd)を使用してこれらのチェックが実際にカーネル空間で(おそらく)実行されるときです。どのポイント実際にアクセス決定が下されます。 詳細な説明: /dirルートchmodが所有するディレクトリがありますr-x------(500)。権限のないユーザーとして実行しましたが、期待/bin/ls /dirどおりに権限拒否エラーが発生しました。 実行すると、ユーザースペースに戻り(「Permission Denied」など)に設定されたシステムコールをstrace -s 10000 /bin/ls /dir表示できます。その後、STDERRにエラーメッセージを出力する後続のシステムコールがあり、すべてが期待どおりに機能します。私はここでシステムコールを見たり電話したことがありません。open-1errnoEACCESwritegetdentsgetdents64 別のターミナルタブ(バイナリの実行時にトリガーされます)で、trace-cmd record -p function_graph -F /bin/ls権限のない同じユーザーとしてTrace-cmdを使用して同じテストを実行すると、デフォルトで私が見るほとんどのシステムコールを1対1にマップできます。 strace および Trace-cmd 出力。/bin/ls /dirtrace-cmdls ただし、違いは、openシステム呼び出し後のTrace-cmd出力で書き込み出力とその終了を見るのではなく呼び出しがgetdents行われるのを見ることです(そして、繰り返しディレクトリ内の項目の完全な呼び出しツリーなど)。 。 。私の考えでは、ftraceの制限(および私の理解による制限の可能性)のために出力でシステムコールの引数や戻り値を見ることができないため、許可エラーがいつ発生するのかわかりません。しかし、私の限られた理解によると、カーネルは実際にディレクトリの完全なリストを実行しますが、出力をユーザー空間に返さないようです。 それでは、実際に何が起こっているのかを説明できる人はいますか?trace-cmdカーネルが実際にgetdentsシステムコールを実行していますが、straceオープンコールが失敗した後に終了するのはなぜですか?権限に関する問題に対処するほとんどのフォーラム投稿(ここや他の場所)では、ファイルを開くときに確認することをお勧めしますが、詳細は提供しません。これは私が見たものと一致しますがstrace(しかしftrace/ではありませんtrace-cmd)。 カーネルソースを見てopen/ systemcallsでopenat手動で追跡すると、inode_permission -> do_inode_permission -> generic_permission -> acl_permission_check後者は実際にクラシックUnix権限を比較し、それから返されるような一連の関数呼び出しを見ることができます。また、SELinux、Apparmor、SMACK、Tomoyoなどの他の場所でもLSMのフックを見ることができ、それらが機能すると想像しています。 私の仮定は、ディレクトリを開こうとすると権限チェックが発生し、カーネルが「いいえ」と言い、ユーザー空間にエラーが返され、実際にディレクトリリストを実行するポイントに到達できないことです。しかし、出力によると、trace-cmdディレクトリのリストが実際に発生しているように見えますが、もはやわかりません。 できるだけ技術的に深い情報を提供していただきありがとうございます。また、Systemtapを使用すると、より多くの情報を得ることができることを知っていますが、これについて私が知っていること非常に限定! 認知度を高めるために、Debianベースのディストリビューションでカーネルバージョン2.6.35と6.5.0をテストしましたが、結果は比較的似ていました。