CentOSのfirewalldにポート番号変更したSSHのサービスを自作して登録する

CentOSのfirewalldにポート番号変更したSSHのサービスを自作して登録する

Table of Contents

CentOSのインストールセットアップでセキュリティ対策のためSSHのポート番号を変えたいけど、firewalldのsshサービスは22番になってる。これを新しいポート番号に対応したい。

この記事は、CentOSのfirewalldのサービスを自作する方法と、ポート番号を変更したSSHサービスを登録する方法を説明します。

ポートではくサービスとして登録するメリット

firewalldが稼働中にSSHサービスのポート番号をデフォルトの22番以外の番号に変更する場合は、firewall-cmd —permanent —add-port=22444/tcpと直接ポート番号指定する方法が簡単です。

例えば、ポート番号22444番のTCPを許可します。

$ sudo firewall-cmd —permanent —add-port=22444/tcp
success
$ sudo firewall-cmd --reload
success

これで許可状態を確認すると、次のように表示されます。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client http https
  ports: 22444/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

portsのところに先程許可したポートが並びます。 追加したばかりなので、この番号はSSHのポート番号だと判断できます。

しかし、これが次のケースだとどうでしょうか?

  • 許可ポートが大量にある
  • 次firewalldを見るのが半年後〜数年後になる
  • 次firewalldを見るのが自分ではない

firewalldのポート開放は、数字と意味がセットにならないと情報が欠落します。 この問題をサービスとして登録することで解決します。

firewalldのサービスの実態はxmlファイル

firewalldで扱っているサービス一覧はfirewall-cmd --get-servicesコマンドで確認できます。

$ firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-apiserver ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh ssh-22444 steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

これらはxmlファイルとして定義されており、/usr/lib/firewalld/servicesに配置されてます。

$ ls /usr/lib/firewalld/services/
RH-Satellite-6.xml       cockpit.xml           freeipa-replication.xml  isns.xml               mdns.xml       ovirt-imageio.xml         rdp.xml              snmptrap.xml           tinc.xml
amanda-client.xml        condor-collector.xml  freeipa-trust.xml        jenkins.xml            memcache.xml   ovirt-storageconsole.xml  redis-sentinel.xml   spideroak-lansync.xml  tor-socks.xml
amanda-k5-client.xml     ctdb.xml              ftp.xml                  kadmin.xml             minidlna.xml   ovirt-vmconsole.xml       redis.xml            spotify-sync.xml       transmission-client.xml
amqp.xml                 dhcp.xml              ganglia-client.xml       kdeconnect.xml         mongodb.xml    plex.xml                  rpc-bind.xml         squid.xml              upnp-client.xml
amqps.xml                dhcpv6-client.xml     ganglia-master.xml       kerberos.xml           mosh.xml       pmcd.xml                  rsh.xml              ssdp.xml               vdsm.xml
apcupsd.xml              dhcpv6.xml            git.xml                  kibana.xml             mountd.xml     pmproxy.xml               rsyncd.xml           ssh.xml                vnc-server.xml
audit.xml                distcc.xml            grafana.xml              klogin.xml             mqtt-tls.xml   pmwebapi.xml              rtsp.xml             steam-streaming.xml    wbem-http.xml
bacula-client.xml        dns-over-tls.xml      gre.xml                  kpasswd.xml            mqtt.xml       pmwebapis.xml             salt-master.xml      svdrp.xml              wbem-https.xml
bacula.xml               dns.xml               high-availability.xml    kprop.xml              ms-wbt.xml     pop3.xml                  samba-client.xml     svn.xml                wsman.xml
bb.xml                   docker-registry.xml   http.xml                 kshell.xml             mssql.xml      pop3s.xml                 samba-dc.xml         syncthing-gui.xml      wsmans.xml
bgp.xml                  docker-swarm.xml      https.xml                kube-apiserver.xml     murmur.xml     postgresql.xml            samba.xml            syncthing.xml          xdmcp.xml
bitcoin-rpc.xml          dropbox-lansync.xml   imap.xml                 ldap.xml               mysql.xml      privoxy.xml               sane.xml             synergy.xml            xmpp-bosh.xml
bitcoin-testnet-rpc.xml  elasticsearch.xml     imaps.xml                ldaps.xml              nfs.xml        prometheus.xml            sip.xml              syslog-tls.xml         xmpp-client.xml
bitcoin-testnet.xml      etcd-client.xml       ipp-client.xml           libvirt-tls.xml        nfs3.xml       proxy-dhcp.xml            sips.xml             syslog.xml             xmpp-local.xml
bitcoin.xml              etcd-server.xml       ipp.xml                  libvirt.xml            nmea-0183.xml  ptp.xml                   slp.xml              telnet.xml             xmpp-server.xml
bittorrent-lsd.xml       finger.xml            ipsec.xml                lightning-network.xml  nrpe.xml       pulseaudio.xml            smtp-submission.xml  tentacle.xml           zabbix-agent.xml
ceph-mon.xml             freeipa-4.xml         irc.xml                  llmnr.xml              ntp.xml        puppetmaster.xml          smtp.xml             tftp-client.xml        zabbix-server.xml
ceph.xml                 freeipa-ldap.xml      ircs.xml                 managesieve.xml        nut.xml        quassel.xml               smtps.xml            tftp.xml
cfengine.xml             freeipa-ldaps.xml     iscsi-target.xml         matrix.xml             openvpn.xml    radius.xml                snmp.xml             tile38.xml

内部では使用するポート番号などが定義されてます。 例えばsshでは次のように定義されてます。

$ cat /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

ssh.xmlのコピーでポート番号変更版sshサービスを作る

サービスの実態が分かれば後は単純な話です。

例えばポート番号を22から22444に変更したsshサービスを用意したい場合は、 既存サービスをコピーしてxml(ssh-22444.xml)内に記載された<port protocol="tcp" port="22"/>の22を22444に変更します。

$ cp /usr/lib/firewalld/services/ssh.xml /usr/lib/firewalld/services/ssh-22444.xml
$ sudo vim /usr/lib/firewalld/services/ssh-22444.xml

これだけでfirewalldに新しいサービス(ssh-22444)が追加されました。 詳細を見るとポートが22444になっていることが確認できます。

$ firewall-cmd --get-services | xargs -n1 echo | grep ssh
ssh
ssh-22444

$ firewall-cmd --info-service=ssh-22444
ssh-22444
  ports: 22444/tcp
  protocols:
  source-ports:
  modules:
  destination:
  includes:
  helpers:

ssh-22444サービスをfirewalldに追加登録する

作成したポート22444版SSHサービス(ssh-22444)をfirewalldに登録します。

登録前は次の状態です。

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

firewalldに作成したサービスを登録します。—-permanentオプションを忘れずに。 これでfirewalldにssh-22444というサービスが登録されます。 登録するとservicesに追加されます。--reloadしないと反映されません。

$ sudo firewall-cmd --permanent --add-service=ssh-22444
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client http https ssh ssh-22444
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

これでSSHのポート番号を22444に変更してもfirewalldに拒否されず接続できるようになります。

不要になった通常のsshサービスを外す

sshd_configでPortの番号を22444に変更したら、ポート22番は使わなくなります。不要にポートは空けたままにしないため通ポート22番のsshサービスをfirewalldから外します。

$ sudo firewall-cmd --permanent --remove-service=ssh
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: cockpit dhcpv6-client http https ssh-22444
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

なお、くれぐれも変更したポートで接続できたのを確認してから外してください。確認を怠りSSHログインができないまま外してしまうと締め出されてしまいます。

firewalldが未起動でポートやサービスを登録する

通常はfirewalldに許可するポートやサービスを登録したり削除したり編集するにはfirewalldが起動していることが必須となります。 しかしファイルを直接編集することで、firewalldが未起動でも登録や削除が可能です。詳しくは「CentOS8のfirewalldが未起動のままポート許可やサービス登録する 」にまとめてあります。

このエントリーをはてなブックマークに追加