RHEL8.1betaでのRHEL8.0からの新機能/変更点まとめ

投稿者: | 2019年9月9日

RHEL 8.1 betaでのRHEL 8.0からの新機能/変更点まとめ(1)

Red Hat Enterprise Linux(以下 RHEL) 8.1 betaが2019/07/24に公開されました。RHEL 8.0の際には導入に尻込みされていたユーザの方々も、8.1からは導入を考えられるかと思います。

ここでは、RHEL 8.1 betaのRHEL 8.0からの差分を簡単に纏めてみます。

RHEL 8.0の個々の新機能の紹介は、別途ブログで順次投稿していく予定です。

RHEL 8.1 betaとRHEL 8.0との差分

ここでは、RHEL 8.1betaのRHEL 8.0からの差分の情報を、Red Hatのリリースノート(8.1 beta Release Notes: Chapter 4. New features)から抜き出してそれぞれ(順不同になってしまいますが)確認したいと思います。

リリースノートによると、RHEL 8.1 betaでの新しい機能としては

  1. The web console
  2. Installer and image creation
  3. Kernel
  4. Infrastructure services
  5. Dynamic programming languages, web and database servers
  6. Desktop
  7. Graphics infrastructures
  8. Hardware enablement
  9. Identity Management
  10. Compilers and development tools
  11. File systems and storage
  12. High availability and clusters
  13. Networking
  14. Security

があります。

順不同になっていまいますが、今回は、「14. Security」の新機能/変更点で、SELinuxの変更点の部分を簡単に纏めます。

尚、RHEL上のパッチの確認には、RHNのサイトからダウンロードできる、それぞれのパッケージのsrc.rpmからソースコード及びpatchとSPECファイルを参照しています。

14.Securityの新機能/変更点

14.1 SELinux

  • SELinux Userspace

SELinux Userspace(libsepol, libselinux, checkpolicy等)が2.9になっています。SELinuxProjectはgithubで開発されており、Kernel Moduleやポリシ言語、setoolsなどそれぞれのリポジトリがあります。

SELinux UserspaceはgithubのWiki

https://github.com/SELinuxProject/selinux/wiki/Userspace-Packages

で概要が紹介されています。

今回2.9になって変更された点は、Releases の2.9のRelease Notes にも載っていますが、主なバグフィックスと機能の変更です。ユーザレベルで見える点としては、下記のようなものになります。

      • libselinuxのmanページ中の数カ所のスペルミスを修正しました(”all all policy”になってたり、”virulization”になっているような箇所の修正です)。
      • ディレクトリを作成する前にlibsemanageがumaskをリセットするように修正しました(下記の部分は抜粋)。
            if (stat(path, &sb) == -1) {
                        if (errno == ENOENT && create) {
        +                       mask = umask(0077);
                                if (mkdir(path, S_IRWXU) == -1) {
        +                               umask(mask);
        
        
      • ROLE_REMOVE auditイベント(AUDIT_ROLE_REMOVE)で直前に使用していたユーザ名を正しく取得できるように修正しました。
        diff -Nru selinux-20180524/libsemanage/src/seusers_local.c selinux-20190315/libsemanage/src/seusers_local.c
        --- selinux-20180524/libsemanage/src/seusers_local.c    2018-05-25 03:21:09.000000000 +0900
        +++ selinux-20190315/libsemanage/src/seusers_local.c    2019-03-15 19:32:30.000000000 +0900
        @@ -71,17 +71,18 @@
                const char *sep = "-";
                int rc = -1;
                strcpy(msg, "login");
        +       if (previous) {
        +               name = semanage_seuser_get_name(previous);
        +               psename = semanage_seuser_get_sename(previous);
        +               pmls = semanage_seuser_get_mlsrange(previous);
        +               proles = semanage_user_roles(handle, psename);
        +       }
                if (seuser) {
                        name = semanage_seuser_get_name(seuser);
                        sename = semanage_seuser_get_sename(seuser);
                        mls = semanage_seuser_get_mlsrange(seuser);
                        roles = semanage_user_roles(handle, sename);
                }
        -       if (previous) {
        -               psename = semanage_seuser_get_sename(previous);
        -               pmls = semanage_seuser_get_mlsrange(previous);
        -               proles = semanage_user_roles(handle, psename);
        -       }
                if (audit_type != AUDIT_ROLE_REMOVE) {
                        if (sename && (!psename || strcmp(psename, sename) != 0)) {
                                strcat(msg,sep);
        
      • checkpolicyコマンドで出力される(重要でないノイズの)メッセージ、例えば下のようなものを削除しました。
        diff -Nru selinux-20180524/checkpolicy/checkmodule.c selinux-20190315/checkpolicy/checkmodule.c
        --- selinux-20180524/checkpolicy/checkmodule.c  2018-05-25 03:21:09.000000000 +0900
        +++ selinux-20190315/checkpolicy/checkmodule.c  2019-03-15 19:32:30.000000000 +0900
        @@ -228,7 +228,6 @@
                        if (optind != argc)
                                usage(argv[0]);
                }
        -       printf("%s:  loading policy configuration from %s\n", argv[0], file);
        
                /* Set policydb and sidtab used by libsepol service functions
                   to my structures, so that I can directly populate and
        @@ -302,8 +301,6 @@
        
                sepol_sidtab_destroy(&sidtab);
        
        -       printf("%s:  policy configuration loaded\n", argv[0]);
        
      • checkpolicyに、バイナリポリシを出力する前にcontextでソートできるように’-S’ / ‘–sort’オプションを追加しました(下記は抜粋)。
        diff -Nru selinux-20180524/checkpolicy/checkpolicy.c selinux-20190315/checkpolicy/checkpolicy.c
        --- selinux-20180524/checkpolicy/checkpolicy.c  2018-05-25 03:21:09.000000000 +0900
        +++ selinux-20190315/checkpolicy/checkpolicy.c  2019-03-15 19:32:30.000000000 +0900
        @@ -111,9 +111,9 @@
         static __attribute__((__noreturn__)) void usage(const char *progname)
         {
                printf
        -           ("usage:  %s [-b[F]] [-C] [-d] [-U handle_unknown (allow,deny,reject)] [-M]"
        -            "[-c policyvers (%d-%d)] [-o output_file] [-t target_platform (selinux,xen)]"
        -            "[input_file]\n",
        +           ("usage:  %s [-b[F]] [-C] [-d] [-U handle_unknown (allow,deny,reject)] [-M] "
        +            "[-c policyvers (%d-%d)] [-o output_file] [-S] "
        +            "[-t target_platform (selinux,xen)] [-V] [input_file]\n",
                     progname, POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX);
                exit(1);
         }
        @@ -394,7 +394,7 @@
                size_t scontext_len, pathlen;
                unsigned int i;
                unsigned int protocol, port;
        -       unsigned int binary = 0, debug = 0, cil = 0, conf = 0;
        +       unsigned int binary = 0, debug = 0, sort = 0, cil = 0, conf = 0;
                struct val_to_name v;
                int ret, ch, fd, target = SEPOL_TARGET_SELINUX;
                unsigned int nel, uret;
        @@ -418,11 +418,12 @@
                        {"mls", no_argument, NULL, 'M'},
                        {"cil", no_argument, NULL, 'C'},
                        {"conf",no_argument, NULL, 'F'},
        +               {"sort", no_argument, NULL, 'S'},
                        {"help", no_argument, NULL, 'h'},
                        {NULL, 0, NULL, 0}
                };
        
      • dbus設定ファイルでの重複したat_consoleステートメントを削除しました。
        diff -Nru selinux-20180524/dbus/org.selinux.conf selinux-20190315/dbus/org.selinux.conf
        --- selinux-20180524/dbus/org.selinux.conf      2018-05-25 03:21:09.000000000 +0900
        +++ selinux-20190315/dbus/org.selinux.conf      2019-03-15 19:32:30.000000000 +0900
        @@ -12,12 +12,8 @@
        
           
        -  
        -    
        -  
           
        -    
        +    
           
        
      • manページのロシア語対応。例えば下のようなものになります。
        diff -Nru selinux-20180524/libselinux/man/ru/man5/customizable_types.5 selinux-20190315/libselinux/man/ru/man5/customizable_types.5
        --- selinux-20180524/libselinux/man/ru/man5/customizable_types.5    1970-01-01 09:00:00.000000000 +0900
        +++ selinux-20190315/libselinux/man/ru/man5/customizable_types.5    2019-03-15 19:32:30.000000000 +0900
        
      • /usr/bin/python3をPythonのデフォルトとして指定。

以下は、本来のソースコードでは対応していませんでしたが、RHEL8.0の時点でRed Hatの方で既にパッチを充てていてサポートされているものになります。

      • audit2whyが一般ユーザでも実行できるようになりました。ただし、こちらに関しては、RHEL8.0の時点で既にサポートされています。
      • audit2allowのxperms対応。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
        --- selinux-python-2.8/audit2allow/audit2allow
        +++ selinux-python-2.8/audit2allow/audit2allow
        @@ -86,6 +86,8 @@ class AuditToPolicy:
        		   dest="type")
         parser.add_option("--perm-map", dest="perm_map", help="file name of per
        m map")
         parser.add_option("--interface-info", dest="interface_info", help="file
        name of interface information")
        +        parser.add_option("-x", "--xperms", action="store_true", dest="xperms",
        +                          default=False, help="generate extended permission rul
        es")
         parser.add_option("--debug", dest="debug", action="store_true", default
        =False,
        		   help="leave generated modules for -M")
         parser.add_option("-w", "--why", dest="audit2why", action="store_true",
        default=(os.path.basename(sys.argv[0]) == "audit2why"),
        @@ -314,6 +316,10 @@ class AuditToPolicy:
             ifs, perm_maps = self.__load_interface_info()
             g.set_gen_refpol(ifs, perm_maps)
        
        +        # Extended permissions
        +        if self.__options.xperms:
        +            g.set_gen_xperms(True)
        
        
      • semanage login で2つのauditイベントのうちの一つが正しかった場合にログに取得しないようにする修正。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
        if add_ind:
        -            cmd = "semanage login -a -r %s -s %s %s" % (new_serange, user[0], u)
        +            cmd = ["semanage", "login", "-a", "-r", new_serange, "-s", user[0], u]
         else:
        -            cmd = "semanage login -m -r %s -s %s %s" % (new_serange, user[0], u)
        -        rc = getstatusoutput(cmd)
        -        if rc[0] != 0:
        -            print(rc[1])
        +            cmd = ["semanage", "login", "-m", "-r", new_serange, "-s", user[0], u]
        +        try:
        +            subprocess.check_call(cmd, stderr=subprocess.STDOUT, shell=False)
        +        except subprocess.CalledProcessError:
             errors += 1
        
        
      • semanage export の出力がibpkey/ibendpointを含むように修正しました。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
        @@ -1603,6 +1621,8 @@ class ibendportRecords(semanageRecords):
         if type == "":
             raise ValueError(_("Type is required"))
        
        +        type = sepolicy.get_real_type_name(type)
        +
         if type not in self.valid_types:
             raise ValueError(_("Type %s is invalid, must be an ibendport type") % type)
         (k, ibendport, port) = self.__genkey(ibendport, ibdev_name)
        @@ -1664,6 +1684,8 @@ class ibendportRecords(semanageRecords):
             else:
        	 raise ValueError(_("Requires setype"))
        
      • sepolicy/semanageがaliasを許可するようになりました。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
        @@ -168,15 +180,21 @@ except ValueError as e:
        def info(setype, name=None):
        if setype == TYPE:
         q = setools.TypeQuery(_pol)
        -        if name:
        -            q.name = name
        +        q.name = name
        +        results = list(q.results())
        +
        +        if name and len(results) < 1:
        +            # type not found, try alias
        +            q.name = None
        +            q.alias = name
        +            results = list(q.results())
        
  • SETools

SEToolsのバージョンが4.2.2になりました。

  • setoolsのmanページの修正に”binary”を追加しました。例えば下のようなものになります。
    +\fBapol\fR supports loading SELinux policies in one of two formats.
    +.RS
    +.IP "source:"
    +A single text file containing a monolithic policy source. This file is usually
    named policy.conf.
    +.IP "binary:"
     A single file containing a binary policy. This file is usually named by version
     on Linux systems, for example, \fIpolicy.30\fR. This file is usually named \fIs
    epolicy\fR on Android systems.
    +.RE
    +.PP
    
  • Aliasのロード時間を早くするためにハッシュテーブルなど諸々を新たに定義してパフォーマンスを上げています。
    +cdef class CategoryAliasHashtabIterator(HashtabIterator):
    +
    +    """Iterate over category aliases in the policy."""
    +
    +    cdef uint32_t primary
    +
    +    @staticmethod
    +    cdef factory(SELinuxPolicy policy, sepol.hashtab_t *table, Category primary
    ):
    +        """Factory function for creating category alias iterators."""
    +        i = CategoryAliasHashtabIterator()
    +        i.policy = policy
    +        i.table = table
    +        i.primary = primary._value
    +        i.reset()
    +        return i
    
  • Boolean

RHEL 8.1になって、SELinuxポリシを調整できるbooleanに下記の4項目が増えているようです。

  • container_use_cephfs
    • コンテナがcephfsを使えるようにします(デフォルト:OFF)。
  • deny_bluetooth
    • bluetoothを使えないようにします(デフォルト:OFF)。
  • logrotate_use_fusefs
    • logrotateがfusefsを使えないようにします(デフォルト:OFF)。
  • unconfined_dyntrans_all

次回予告

今回はここまでです。次回は同じくセキュリティのOpenSCAPの修正点とその他を簡単に纏めます。