web-dev-qa-db-ja.com

crontabのすべてのコマンドが「Permission denied」で失敗します

更新:この問題には最終的な回答はありません。私は別のディストリビューションに移りましたが、それ以来この問題を観察していません。その時点で得られる洞察に富んだ回答でそれを修正することはできませんでしたが、燃費は異なる場合があります(YMMV)。


crontab -eおよびcrontab -lは正常に機能します。

$ crontab -l | grep -v '^#'
* * * * * /usr/bin/env
* * * * * echo 'Hello from crontab'

ただし、/var/log/syslogには毎分次のような2つのメッセージが表示されます。

Mon DD hh:mm:01 username CRON[PID]: Permission denied

crontabは読み込まれていますですが、どういうわけか何も実行できません(もちろん、同じユーザーとしてログインしたときにコマンドを確認しました)。理由は何ですか?

/etc/cron.allowおよび/etc/cron.denyは存在しません。

crontabはsetuidグループsetuid:

$ stat --format '%A %U %G' /usr/bin/crontab
-rwxr-sr-x root crontab

Crontabsディレクトリには適切な権限があるようです。

$ stat --format '%A %U %G' /var/spool/cron/crontabs
drwx-wx--T root crontab

Crontab自体は私が所有しています(驚くことではありませんが、編集できるからです):

$ Sudo stat --format '%A %U %G' /var/spool/cron/crontabs/$USER
-rw------- username crontab

私はnotcrontabグループのメンバーです。

これらの行は毎分/var/log/auth.logに表示されます(@Alaaに感謝):

Mon DD hh:mm:01 username CRON[1752]: pam_unix(cron:session): session opened for user username by (uid=0)
Mon DD hh:mm:01 username CRON[1752]: PAM bad jump in stack

たぶん、PAMが壊れていますか? pam-auth-update(@coteyrに感謝)はこれらすべてをリストし、それらはすべて有効になっています。

  • Unix認証
  • GNOMEキーリングデーモン-ログインキーリング管理
  • eCryptfsキー/マウント管理
  • ConsoleKitセッション管理
  • 継承可能な機能管理

それらのいずれかを安全に無効にすることはできますか?暗号化されたファイルシステムを使用していません。

Debianバグエントリ に基づいて、debconf-show libpam-runtimeを実行しようとしましたが、次のエラーメッセージが表示されました。

debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied

/etc/pam.d/cronの内容:

# The PAM configuration file for the cron daemon

@include common-auth

# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session       required   pam_env.so

# In addition, read system locale information
session       required   pam_env.so envfile=/etc/default/locale

@include common-account
@include common-session-noninteractive 

# Sets up user limits, please define limits for cron tasks
# through /etc/security/limits.conf
session    required   pam_limits.so

session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid

記載されているファイル(/etc/environmentpam_env.so/etc/default/localepam_limits.sopam_succeed_if.so)はすべてユーザーが読み取り可能です。

Ubuntu 13.04を使用し、同じユーザーcrontab、/etc/cron.{allow,deny}、上記と同じ権限を持ち、crontabグループのメンバーではない別のホストでは、正常に機能します(コマンドは記録しますが、出力は/var/log/syslog)。


最初のcrontab行を変更することにより:

* * * * * /usr/bin/env >/tmp/env.log 2>&1

/ tmpが誰でも書き込み可能であることを確認します。

$ Sudo -u nobody touch /tmp/test
$ ls /tmp/test
/tmp/test
$ ls -ld /tmp
drwxrwxrwt 15 root root 12288 May 27 10:18 /tmp

crontabコマンドがまったく実行されないことを確認しましたPermission deniedメッセージは/var/log/syslogに表示されますが、 /tmp/env.logは作成されません。


/etc/pam.d設定のランダムなリスト に基づいて、以下の矛盾が見つかりました。

$ grep '^[^#]' /etc/pam.d/sshd 
@include common-auth
account    required     pam_nologin.so
@include common-account
@include common-session
session    optional     pam_motd.so # [1]
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
session    required     pam_env.so # [1]
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
@include common-password
$ grep '^[^#]' /etc/pam.d/common-session
session [default=1]         pam_permit.so
session requisite           pam_deny.so
session required            pam_permit.so
session optional            pam_umask.so
session required    pam_unix.so 
session optional    pam_ecryptfs.so unwrap
session optional            pam_ck_connector.so nox11
$ grep '^[^#]' /etc/pam.d/common-account
account [success=1 new_authtok_reqd=done default=ignore]    pam_unix.so 
account requisite           pam_deny.so
account required            pam_permit.so
$ grep '^[^#]' /etc/pam.d/common-session-noninteractive 
session [default=1]         pam_permit.so
session requisite           pam_deny.so
session required            pam_permit.so
session optional            pam_umask.so
session required    pam_unix.so 
session optional    pam_ecryptfs.so unwrap

インストールされたPAMパッケージ:

$ dpkg --get-selections | grep --invert-match deinstall | cut --fields 1 | grep pam
libpam-cap
libpam-ck-connector
libpam-gnome-keyring
libpam-modules
libpam-modules-bin
libpam-runtime
libpam0g
python-pam

私はこれらを再インストールしようとしました-助けにはなりませんでした:

$ Sudo apt-get install --reinstall $(dpkg --get-selections | grep --invert-match deinstall | cut --fields 1 | grep pam)

依存関係が満たされていないため、これらを削除して再インストールすることはできません。

10
l0b0

PAM bad jump in stackは大きな手がかりです。

/etc/pam.d/cronはストックバージョンと異なり、最後に1行追加されます。

session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid

success=1ビットは、「このモジュールが成功した場合、次のルールをスキップする」ことを意味します。これはPAM構成の最後の行であるため、次のルールはありません。

2
Marius Gedminas

LDAPユーザー(非マシンユーザー)からcronをスケジュールし、基本的なechoコマンドまたはスクリプトをcrontabに入れても、同じpermission deniedを取得しようとしました。マシンユーザー(/ etc/passwdにエントリがある)。 OPによって追加された詳細なトラブルシューティングコメントの助けを借りて、次の行を見つけたファイル/var/log/auth.logを確認しました。

pam_sss(cron:account): Access denied for user my_username: 6 (Permission denied)

ちょっとしたGoogle検索で これに 答えてくれました。ここにも詳細を追加します。

/etc/sssd/sssd.confのドメインの下に、このようなエントリ(最後の行を参照)を追加しました。

[domain/my.domain.com]
....
ad_gpo_map_interactive = +cron

そして、Sudo service sssd restartを実行しましたが、これは魅力のように機能します。

1
pratpor

PAMの構成が不適切です。これは、指紋スキャナー、LDAPアカウント、USBキー、または並べ替えなどの「外部」認証方法を使用している場合に一般的です。基本的に、cronは指紋スキャナーとして機能しないため、ユーザーとしてログインできません。

/etc/pam.d/common-*から問題のある構成を削除する必要がありますが、特に手動で何かを有効にしなかった場合(たとえば、指紋スキャナーのセットアップスクリプトが何かをオンにした場合)は、追跡が少し難しくなります。

それらのファイルに何を含めるべきかを伝えることはあまり役に立ちません。設定によって多くのことが異なる場合があります。しかし、「Unix認証」だけで「左」まで「必須」認証方法を無効にすることは良い最初のステップかもしれません。

これを行うには、pam-auth-updateをルートとして実行し、他のボックスのチェックを外します。これを行うと、誤ってログインするとシステムにログインできなくなる可能性があるため、非常に注意してください。一度に1つずつ無効にし、安全のために再起動して、テストします。 無効にしない "Unix認証"

1
coteyr