2020년 3월 12일 목요일

[CentOS8] Cockpit 사용하기 -브라우저에서 서버 관리


Cockpit은 리눅스 서버를 브라우저에서 모니터링 및 관리/제어 할 수 있도록 해주는 도구입니다.
CentOS 8 에서는 Cockpit이 기본 탑재되어 별도의 설치 없이 사용이 가능합니다.




설치하기





다음의 명령어로 자신의 CentOS 서버에 Cockpit이 설치되어있는지 확인할 수 있습니다.




sudo yum list installed | grep cockpit





Cockpit이 설치되어있을 경우 위처럼 확인할 수 있습니다.




설치되어있지 않다면 다음 명령어를 입력하여 설치합니다.




sudo yum install cockpit




서비스 시작 및 등록





Cockpit 서비스를 실행하기 위해 아래 명령어를 입력합니다.




sudo systemctl start cockpit




아래의 명령어로 Cockpit을 서비스에 등록할 수 있습니다.




sudo systemctl enable cockpit.socket




브라우저에서 접속하기





웹브라우저에서 Cockpit을 실행 중인 서버의 9090 포트로 접근하면 관리 페이지로 접근이 가능합니다.





root 계정과 비밀번호로 로그인이 가능합니다.




접속이 안되는 경우





접속이 불가능한 경우 9090 포트가 정상적으로 열려있거나 Cockpit 서비스가 방화벽 예외처리 되어있는지 확인해봅니다.




아래의 명령어로 열려있는 포트를 확인 합니다.




sudo firewall-cmd --list-posrts





9090포트가 열려있지 않습니다.




아래의 명령어로 방화벽 예외 처리된 서비스를 확인합니다.




sudo firewall-cmd --list-service





Cockpit이 방화벽 예외 서비스로 등록되어있습니다.




9090 포트 혹은 cockpit 서비스가 예외처리 되어있지 않은 경우 아래의 명령어로 방화벽 예외처리를 해줍니다.




sudo firewall-cmd --permanent --zone=public --add-service=cockpit
sudo firewall-cmd --permanent --zone=public --add-port=9090/tcp




위의 두 명령어 중 하나만 수행한 후 아래의 명령어로 방화벽 규칙을 새로 고침 해주면 됩니다.




sudo firewall-cmd --reload

[Spring] Jasypt를 이용하여 Property 암호화 하기 + 메이븐 플러그인


Spring 프로젝트의 Properties 파일에는 DB 연결정보, 이메일 계정, API Key 등의 보안에 민감한 정보들이 포함될 수 있습니다.
이 상태에서 프로젝트를 그대로 공유하게 되면 보안에 심각한 문제가 생길 수 있습니다.
이를 방지하기 위해 Spring 프로젝트에서 jasypt-spring-boot의 비밀번호 기반 암호화를 이용하여 중요한 정보들을 암호화하는 방법을 설명합니다.




참고
https://github.com/ulisesbocchio/jasypt-spring-boot




Dependency 추가





프로젝트의 pom.xml에 다음 Dependency를 추가합니다.




<dependency>
 <groupId>com.github.ulisesbocchio</groupId>
 <artifactId>jasypt-spring-boot-starter</artifactId>
 <version>3.0.2</version>
</dependency>




Property 설정





적용 및 테스트를 위해 application.properties에 다음과 같이 비밀번호를 작성합니다.
(실사용 시에는 비밀번호를 프로퍼티에서 삭제해주세요)




jasypt.encryptor.password=ExamplePassword123




-주의-
위처럼 비밀번호를 프로퍼티에 작성할 경우 결과적으로 비밀번호가 노출되기 때문에 보안 효과가 없습니다.
테스트 외에 실제 서비스에서 사용한다면 꼭 프로퍼티 파일 내 비밀번호를 삭제하고
비밀번호를 시스템 변수나 환경 변수에 등록하여 사용하시기를 권장합니다.




필수 프로퍼티는 jasypt.encryptor.password 밖에 없으며
이 외에 추가할 수 있는 프로퍼티는 다음과 같습니다.
작성하지 않으면 아래의 기본값이 적용됩니다.
자세한 내용은 https://github.com/ulisesbocchio/jasypt-spring-boot에서 확인해주세요.




jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations=1000
jasypt.encryptor.pool-size=1
jasypt.encryptor.provider-name=SunJCE
jasypt.encryptor.provider-class-name=null
jasypt.encryptor.salt-generator-classname=org.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type=base64
jasypt.encryptor.proxy-property-sources=false
jasypt.encryptor.skip-property-sources=empty list




사용하기





테스트 작성





테스트 유닛을 작성하여 암복호화가 작동하는지 확인해봅니다.




@SpringBootTest
public class JasyptTests {

 @Autowired
 StringEncryptor configurationEncryptor;
 
 static final String TEST_PASSWORD = "테스트용 비밀번호 입니다.";
 
 @Test
 public void encryptTest() {
  String encryptedPassword = configurationEncryptor.encrypt(TEST_PASSWORD);
  System.out.println("encrypted password is : " + encryptedPassword);
  String decryptedPassword = configurationEncryptor.decrypt(encryptedPassword);
  assertThat(decryptedPassword).isEqualTo(TEST_PASSWORD);
 }
}




테스트가 성공하면 콘솔에서 아래와 비슷한 암호화된 문자열을 확인할 수 있습니다.




encrypted password is : cA8DhDVl27MeHDSQRn8GSfUFGn+Qif2n9Zv8OLlq67yiijVJTe0wqwzRE9eIBSlfNQ5HeYirCXMZFwXPbO7LAHe+q/PeWxNcYE9Tr1LeBEs=




프로퍼티에 적용





공개되면 안 되는 프로퍼티 값을 암호화한 후 아래와같이 ENC()로 감싸서 작성하게 되면 프로퍼티를 불러올 때 자동으로 복호화하여 적용합니다.




test=ENC(cA8DhDVl27MeHDSQRn8GSfUFGn+Qif2n9Zv8OLlq67yiijVJTe0wqwzRE9eIBSlfNQ5HeYirCXMZFwXPbO7LAHe+q/PeWxNcYE9Tr1LeBEs=)




여기까지 적용하게 되면 프로퍼티 파일 노출로 인한 정보 노출을 방지할 수 있습니다.




프로퍼티를 불러올 때 정상적으로 복호화가 되는지 테스트를 위해
위의 JasyptTests 클래스에 다음과 같이 테스트코드를 추가하였습니다.




@SpringBootTest
public class JasyptTests {
 // 기존 코드 생략
 ...

 @Value("${test}")
 String test;

 @Test
 public void propertyTest() {
  System.out.println("test password is : " + test);
  assertThat(test).isEqualTo(TEST_PASSWORD);
 }
}




테스트 정상적으로 완료되었다면 콘솔에서 복호화된 문자열을 확인할 수 있습니다.




test password is : 테스트용 비밀번호 입니다.




플러그인





위의 방식으로 민감한 정보들은 전부 암호화하여 사용하는 걸로도 충분하지만
플러그인과 메이븐 명령어를 이용하여 간단하게 암호화하는 방법을 소개합니다.




이를 위해서는 메이븐 명령어를 사용 가능해야 하며 메이븐 명령어의 기본적인 사용 방법은 다른 가이드를 참고해 주시길 바랍니다.




플러그인 추가





우선 플러그인 사용을 위해 pom.xml에 플러그인을 추가합니다.




<plugin>
 <groupId>com.github.ulisesbocchio</groupId>
 <artifactId>jasypt-maven-plugin</artifactId>
 <version>3.0.2</version>
</plugin>




프로퍼티 작성





프로퍼티를 작성할 때 암호화되지 않은 정보들을 DEC()로 감싸서 작성하게 되면 플러그인을 이용하여 일괄적으로 암호화 할 수 있습니다.




test=DEC(암호화되지 않은 테스트 프로퍼티 입니다.)




명령어를 이용하여 암복호화





콘솔에서 아래의 명령어로 application.properties 파일 내 DEC()로 감싸진 정보들을 일괄적으로 암호화 할 수 있습니다.
환경변수에 jasypt.encryptor.password를 등록해 놨다면 아래의 명령어에서 생략 가능합니다.




mvn jasypt:encrypt -Djasypt.encryptor.password="ExamplePassword123"




역으로 복호화도 가능합니다.




mvn jasypt:decrypt -Djasypt.encryptor.password="ExamplePassword123"




이를 이용하면 암호화된 정보를 좀 더 쉽게 수정하고 다시 암호화가 가능합니다.




프로퍼티 파일 지정하기





위처럼 명령어를 이용하면 application.properties가 아닌 application-test.properties 같은 파일은 암복호화가 되지 않습니다.
다른 파일을 암복호화 하고 싶을 경우 jasypt.plugin.path 파라미터로 파일을 지정할 수 있습니다.




mvn encrypt:encrypt -Djasypt.encryptor.password="ExamplePassword123" -Djasypt.plugin.path="file:src/main/test/application-dev.properties"




단독 값 암복호화 하기





아래의 명령어로 프로퍼티 파일과 별개로 단독 문자열을 암호화하거나 복호화가 가능합니다.




mvn jasypt:encrypt-value -Djasypt.encryptor.password="ExamplePassword123" -Djasypt.plugin.value="theValueYouWantToEncrypt"

mvn jasypt:decrypt-value -Djasypt.encryptor.password="ExamplePassword123" -Djasypt.plugin.value="DbG1GppXOsFa2G69PnmADvQFI3esceEhJYbaEIKCcEO5C85JEqGAhfcjFMGnoRFf"





[Spring Security] PasswordEncoder를 Bean에 등록하여 사용하기 -PasswordEncoderFactories로 DelegatingPasswordEncoder 생성하기


현재 진행 중인 프로젝트에서 비밀번호 관리를 위해 Password Encoder를 사용하고 있습니다.
Password Encoder 구현체를 Bean에 등록하여 사용하기 위해 직접 DelegatingPasswordEncoder를 생성하여 Bean에 등록하였는데
Speing Security 5.0 이후부터는 DelegatingPasswordEncoder를 생성해주는 Factory 클래스가 추가되어 직접 생성할 필요가 없어졌기 때문에 해당 문서를 작성하였습니다.




Spring Security가 프로젝트에 적용되어있다면 다음과 같이 @Bean을 작성하기만 하면 됩니다.




@Configuration
public class SecurityConfiguration {

 @Bean
 public PasswordEncoder passwordEncoder() {
  return PasswordEncoderFactories.createDelegatingPasswordEncoder();
 }
}




사용할 때는 다음과 같이 사용할 수 있습니다.




class PasswordTests extends ApplicationTests {

 @Autowired
 PasswordService passwordTest;
 
 @Test
 void test() {
  String rawPassword = "비밀번호 입니다.";
  String encrypted = passwordTest.encrypt(rawPassword);

  assertThat(encrypted).contains("bcrypt");
  assertThat(passwordTest.match(rawPassword, encrypted)).isTrue();
 }

}

2019년 9월 30일 월요일

[Selenium] 1. Java와 Firefox를 이용하여 Google검색 자동화 하기

개요

Selenium은 브라우저를 자동화 할 수 있는 도구이며
일반적으로 이를 이용하여 자동화 테스트를 수행하거나 웹 크롤링 등을 수행할 수 있습니다.

해당 가이드에서는 Java와 Selenium, Firefox Driver를 사용하여
구글에 접속 후 검색어를 입력하고 검색하는 테스트 코드를 작성합니다.

해당 가이드는 다음과 같은 준비물이 필요합니다.
  • Java JDK
  • Eclipse IDE
  • Firefox Web Browser (다른 브라우저도 사용 가능하지만 해당 가이드에서는 Firefox를 이용한 방법을 다룹니다. Firefox외의 브라우저는 https://www.seleniumhq.org/download/에서 해당 브라우저에 맞는 Web Driver를 찾으시길 바랍니다.)

프로젝트 생성

예제 작성을 위한 프로젝트를 생성합니다.
메뉴의 File - New - Project...를 클릭한 뒤 Maven Project를 선택합니다.
Eclipse New Project Window
아래와 같이 프로젝트 정보를 입력한 후 프로젝트를 생성합니다.
Eclipse New Maven Project Window

Web Driver 다운로드

https://github.com/mozilla/geckodriver/releases에 접속하여 자신의 OS에 맞는 Firefox 드라이버를 다운로드 받습니다.
geckodriver releases Assets Download Page

다운받은 압축파일을 해제한 뒤 geckodriver 파일을 프로젝트의 resources 폴더로 이동시킵니다.
geckodriver on resources folder picture
geckodriver는 Linux 계열, geckodriver.exe는 Windows 계열 OS에서 사용 가능한 파일입니다. 필요한 Driver만 다운로드하여 추가하면 됩니다.

Selenium 의존성 추가

pom.xml 파일의 dependencies 태그 내에 다음 내용을 추가하여 Selenium을 사용하기 위한 Maven 의존성을 추가합니다.

<dependency>
 <groupId>org.seleniumhq.selenium</groupId>
 <artifactId>selenium-java</artifactId>
 <version>${selenium.version}</version>
</dependency>

Selenium은 문서 작성 기준 3.141.59버전을 사용했습니다.

자동화 테스트 작성

의존성 추가 후 Selenium을 테스트하는 간단한 예제를 작성해봅니다.

다음은 Firefox Driver를 생성하고
Google에 접속한 뒤 "Selenium WebDriver"검색하여 나온 결과를
로그에 소스 코드로 출력하는 예제입니다.

코드를 실행하기 전 GECKO_DRIVER_PATH를 resources 폴더에 추가한 geckodriver 파일명에 맞도록 수정해야 합니다.

package com.jeent.alcohol;

import java.nio.file.FileSystems;
import java.nio.file.Path;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumTests {
 

public static final String DRIVER_PROPERTY = 
   "webdriver.gecko.driver";

 // TODO: resources 폴더 내의 geckodriver파일명에 맞춰 수정해줍니다.
public static final String GECKO_DRIVER_PATH = "src/main/resources/geckodriver.exe"; public static void main(String[] args) { Path path = FileSystems.getDefault().getPath(GECKO_DRIVER_PATH); System.setProperty(DRIVER_PROPERTY, path.toString()); WebDriver driver = new FirefoxDriver(); driver.get("https://www.google.com"); driver.findElement(By.name("q")).sendKeys("Selenium WebDriver"); driver.findElement(By.name("f")).submit(); new WebDriverWait(driver, 20).until( ExpectedConditions.visibilityOfElementLocated(By.id("resultStats"))); String source = driver.getPageSource(); System.out.println(source); } }

main 메서드를 실행하면 Firefox 브라우저가 실행되면서 예제 코드에서 작성한 동작이 수행되는 것을 확인할 수 있습니다.

Selenium을 활용하면 브라우저를 제어 할 수 있는 것 뿐만 아니라, 브라우저에 출력되는 내용을 읽어서 데이터화하는 크롤링 작업도 가능합니다.

다음 가이드에서는 예제에서 사용된 WebDriverWait 클래스의 용도를 자세히 알아보고 이어서 유튜브 재생목록을 크롤링하는 예제를 작성해 보도록 하겠습니다.

2019년 9월 29일 일요일

CentOS 8 에 MariaDB 및 phpMyAdmin 설치하기

해당 문서는 MySQL과 호환되는 데이터베이스인 MariaDB와 
PHP로 개발되어 웹 환경에서 DB를 관리할 수 있는 도구인 phpMyAdmin을 
CentOS 8버전에 설치하는 방법을 설명합니다.

학습 및 실습 중 작성된 문서이므로 문서에 오류가 존재할 수 있습니다. 잘못된 점에 대한 지적은 언제나 환영합니다.

MariaDB

시스템 업데이트

MariaDB를 설치하기 전 다음 명령어로 CentOS 시스템을 업데이트 합니다.

sudo dnf -y update

MariaDB 서버 설치

아래의 명령어로 Repository에 MariaDB가 존재하는지, 어느 버전인지 확인합니다.

dnf info mariadb

확인 시점 기준 최신버전은  10.3.11버전이며, AppStream Repository에 포함되어 있습니다.

다음 명령어로 MariaDB를 설치합니다.

sudo dnf module install mariadb

설치 확인

설치가 완료되면 다음 명령어로 MariaDB 설치 여부와 설치 버전 등의 정보를 확인할 수 있습니다.

rpm -qi mariadb-server

MariaDB 실행하기

설치된 MariaDB를 실행하고 서버가 시작될 때 같이 실행될 수 있도록 시작프로그램에 등록합니다.
다음의 명령어를 이용하여 시작프로그램에 등록합니다.

sudo systemctl enable --now mariadb

다음 명령어로 시작프로그램에 등록되었는지, 서비스가 실행중인지 확인할 수 있습니다.

systemctl status mariadb

기본 보안 설정

서버가 정상적으로 등록되고 실행되었다면 아래의 명령어를 이용해서 기본 보안설정을 실시합니다.

mysql_secure_installation

명령어를 실행 후 출력되는 스크립트에 따라 보안 설정을 합니다.

Enter current password for root (enter for none):
OK, successfully used password, moving on...
Secure Installation을 수행하기 위해 root 비밀번호를 입력합니다.
초기 root비밀번호는 없기 때문에 공백 상태로 Enter를 누릅니다.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!
새로운 root비밀번호와 비밀번호 확인을 입력합니다.

Remove anonymous users? [Y/n] y
 ... Success!
보안을 위해 익명 사용자를 제거합니다.

Disallow root login remotely? [Y/n] y
 ... Success!
원격에서 root계정으로 접속할 수 없도록 합니다.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!
test데이터베이스를 삭제합니다.

Reload privilege tables now? [Y/n] y
 ... Success!
권한 테이블을 리로드 합니다.

MariaDB서버에 접속하기

테스트를 위해 root계정으로 데이터베이스 서버에 접속해봅니다.
아래의 명령어를 이용하여 접속합니다.

mysql -u root -p

접속을 성공하면 환영메세지와 함게 MariaDB 콘솔을 확인할 수 있습니다.
여기까지 성공하였다면 MariaDB 설치와 설정은 끝났습니다.

phpMyAdmin

phpMyAdmin은 PHP로 작성 되어있기 때문에 PHP와 Apache를 설치한 뒤 phpMyAdmin을 설치하는 방법을 설명합니다.

PHP 설치하기

다음 명령어로 설치 가능한 PHP모듈을 확인합니다.

dnf module list | grep php

PHP 7.2 버전이 제공되는 것을 확인할 수 있습니다.
아래의 명령어로 PHP를 설치합니다.

sudo dnf module install php

설치 후 php -v 명령어로 설치된 PHP버전을 확인할 수 있습니다.

다음의 명령어로 php-mysqlnd 확장기능을 설치합니다.

sudo dnf install php-mysqlnd

설치 후 다음의 명령어로 mysqlnd가 설치되어있는지 확인할 수 있습니다.

php -m | grep mysqlnd

Apache Web Server 설치

Apache 웹 서버 패키지인 httpd를 설치합니다.
아래의 명령어로 Apache 서버 패키지인 httpd를 설치 가능한지 확인합니다.
dnf module list | grep httpd

아래의 명령어로 httpd 모듈의 상세정보를 확인할 수 있습니다.
dnf module info httpd

아래의 명령어로 httpd를 설치합니다.
sudo dnf module install httpd

설치가 완료되면 httpd를 실행시키고 시작프로그램에 등록하기 위해 아래의 명령어로 실행합니다.

sudo systemctl enable --now httpd

phpMyAdmin 설치

다운로드

phpMyAdmin 다운로드 페이지에 접속하여 최신버전의 phpMyAdmin tar.gz 압축 파일의 다운로드 URL을 복사합니다.

복사한 URL을 wget명령어로 다운받습니다.

cd ~
wget https://www.phpmyadmin.net/downloads/

압축 해제

phpMyAdmin 폴더를 생성한 뒤 다운받은 압축파일을 압축해제합니다.

sudo mkdir /usr/share/phpmyadmin
sudo tar xvf phpMyAdmin-4.9.1-all-languages.tar.gz -C /usr/share/phpmyadmin/ --strip-components=1

임시파일 디렉토리 생성

임시파일이 저장될 디렉토리를 생성하고 권한을 설정합니다.

sudo mkdir -p /var/lib/phpmyadmin/tmp
sudo chown -R apache:apache /var/lib/phpmyadmin

config.inc.php 파일 생성

샘플 파일을 복사하여 설정파일을 생성합니다.

sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

생성한 config 파일을 수정합니다.

sudo vim /usr/share/phpmyadmin/config.inc.php

$cfg['blowfish_secret'] = ''
부분에 문자열로 된 비멀번호를 추가합니다.

설정파일 하단에
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
내용을 추가하여 임시파일 경로를 설정합니다.

Apache Web Server 설정

httpd 설정파일에 phpmyadmin 내용을 추가하여 접속이 가능하도록 설정합니다.

sudo vim /etc/httpd/conf.d/phpmyadmin.conf

phpmyadmin.conf 내에 다음 내용을 추가한 뒤 저장합니다.
# Apache configuration for phpMyAdmin
Alias /phpMyAdmin /usr/share/phpmyadmin/
Alias /phpmyadmin /usr/share/phpmyadmin/
 
<Directory /usr/share/phpmyadmin/>
   AddDefaultCharset UTF-8
 
   <IfModule mod_authz_core.c>
     # Apache 2.4
     Require all granted
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

httpd를 재시작 해줍니다.

sudo systemctl restart httpd

방화벽 설정

다음 명령어로 방화벽 예외에 http 서비스를 추가해줍니다.

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload

phpMyAdmin 접속

웹 브라우저에서 http://{서버IP}/phpMyAdmin 으로 접속하면 아래와같은 phpMyAdmin 로그인 페이지를 확인할 수 있습니다.
 MariaDB 계정과 비밀번호로 로그인하면 접속이 가능하며, phpMyAdmin 기능을 이용할 수 있습니다.

여기까지 완료 되었다면 이제 phpMyAdmin을 이용할 수 있습니다.

테스트용으로 사용한다면 지금 상태로도 충분히 사용 가능하지만
민감한 정보를 다루거나 실 사용을 위한 DB로 활용하려면 
꼭 환경에 맞게 추가적인 보안 작업을 진행 한 후 사용하시길 바랍니다.

2019년 9월 28일 토요일

CentOS8 에서 Cockpit 사용하기

Cockpit은 리눅스 서버를 브라우저에서 모니터링 및 관리/제어 할 수 있도록 해주는 도구입니다.

CentOS8 에서는 Cockpit이 기본 탑재되어 별도의 설치 없이 사용이 가능합니다.

해당 문서는 학습 및 실습 과정에서 작성되고있는 문서이기 때문에 오류가 존재할 수 있으며 오류에 대한 지적은 언제나 환영합니다.

설치하기

다음의 명령어로 자신의 CentOS서버에 Cockpit이 설치되어있는지 확인할 수 있습니다.
sudo yum list installed | grep cockpit
Cockpit이 설치되어있을 경우 위와같이 확인할 수 있습니다.
설치되어있지 않다면 다음 명령어를 입력하여 설치합니다.
sudo yum install cockpit

실행 및 시작프로그램 등록

다음 명령어로 Cockpit을 실행합니다.
sudo systemctl start cockpit

아래 명령어로 Cockpit을 시작프로그램으로 등록 할 수 있습니다.
sudo systemctl enable cockpit.socke

Cockpit 접속하기

웹브라우저에 아래의 주소를 입력하면 Cockpit 로그인 페이지를 확인할 수 있습니다.
http://{서버의IP주소}:9090/

CentOS의 계정과 비밀번호로 접속하면 모니터링 및 관리 작업을 수행할 수 있습니다.

접속이 안되는 경우

접속이 불가능 한 경우 아래의 명령어로 9090포트가 열려있는지 Cockpit서비스가 방화벽 예외 처리가 되어있는지 확인합니다.

열려있는 포트 확인
sudo firewall-cmd --list-posrts
9090포트가 열려있지 않습니다.
방화벽 예외 서비스 확인
sudo firewall-cmd --list-service
cockpit이 방화벽 예외 서비스에 등록되어있습니다.
9090포트 혹은 cockpit 서비스가 예외처리 되어있지 않는경우 아래의 명령어로 방화벽 예외처리를 해줍니다.

sudo firewall-cmd --permanent --zone=public --add-service=cockpit
혹은
sudo firewall-cmd --permanent --zone=public --add-port=9090/tcp

두 명령어 중 하나만 수행한 후 아래의 명령어로 리로드 해줍니다.
sudo firewall-cmd --reload