Blog
  • 2020
    • March
    • January
  • 2019
  • 2018

Blog

GPG



GPG key list

gpg --list-keys
gpg --list-secret-keys



GPG key create

gpg --gen-key



GPG key export

# 키 확인
gpg --list-secret-keys

# export
gpg --export-secret-keys $ID > my-key.asc



GPG key import

# import
gpg --import my-key.asc

# 'Key already known' 에러가 발생하는 경우 키 삭제 필요 - 모든 키 삭제
gpg --delete-keys
gpg --delete-secret-keys





sudo rm -rf /var/lib/apt/lists/*
sudo apt-get update





설치하기

# 필요패키지 설치
sudo apt install gdebi-core libxml2:i386 libcanberra-gtk-module:i386 gtk2-engines-murrine:i386 libatk-adaptor:i386

# Adobe Acrobat Reader 다운로드
wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9.x/9.5.5/enu/AdbeRdr9.5.5-1_i386linux_enu.deb

#  Adobe Acrobat Reader 설치
sudo gdebi AdbeRdr9.5.5-1_i386linux_enu.deb



실행하기

좌측 하단 '메뉴 > 오피스 >  Adobe Reader 9' 확인




Server 설정 - ssh-key 생성

# 명령어
ssh-keygen -t rsa -b 2048

# 예제
hamonikr@server:~$ ssh-keygen -t rsa -b 2048

# 출력
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hamonikr/.ssh/id_rsa): #hit enter
Enter passphrase (empty for no passphrase): #hit enter
Enter same passphrase again: #hit enter
Your identification has been saved in /home/hamonikr/.ssh/id_rsa.
Your public key has been saved in /home/hamonikr/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wVx3ZbrNB790ThEgLDvjLYJnTHcMUIBDrKA1TOHSVhk hamonikr@server
The key's randomart image is:
+---[RSA 2048]----+
| oo.E+.o+.o...ooo|
| ++..+ o + o.. o.|
|o.=.. . + =   o. |
|.o .   . * o   *.|
|      + S =   ..B|
|     . = o .  .o+|
|      o . .    ..|
|                 |
|                 |
+----[SHA256]-----+





Client 설정 - ssh-key copy

# 명령어
ssh-copy-id user@server

# 예제
hamonikr@client ~ $ ssh-copy-id hamonikr@192.168.0.1

# 출력
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/hamonikr/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)



Linux Meta-packages



요약

특정 패키지 그룹 혹은 대량의 패키지 설치 등 등의 작업을 일괄적으로 처리하기 위한 용도의 패키지이며

해당 패키지를 업데이트 하는 것으로 패키지 그룹의 버전 관리를 자동으로 처리 할 수 있도록 지원 가능



메타 패키지

메타 패키지란 응용 프로그램 그룹 혹은 해당 라이브러리 및 문서를 대량 설치할 때 사용하는 편리한 방법.

많은 Linux 배포판은 새로운 릴리즈가 될 시드 디스크 이미지부터 사용자가 쉽게 설치할 수 있는 소프트웨어 번들을 만드는 데 이르기 까지 다양한 목적으로 사용합니다.

메타 패키지에는 변경 로그 및 저작권 정보 이외의 내용이 포함되어 있지 않으며 자체 응용 프로그램이나 라이브러리가 포함되어 있지 않습니다.

이 패키지의 작동 방식은 패키지 관리자가 읽는 종속성(Depends) 목록을 갖는 것 이며 패키지 관리자는 종속성이 설정된 패키지를 찾아 설치합니다.



예시 패키지

linux-kernel-generic_4.15.0-54_all.deb

# 패키지 정보 확인
dpkg --info linux-kernel-generic_4.15.0-54_all.deb 


# output
new Debian package, version 2.0.
 size 1924 bytes: control archive=568 bytes.
     409 bytes,    11 lines      control              
     168 bytes,     2 lines      md5sums              
 Package: linux-kernel-generic
 Source: linux-kernel
 Version: 4.15.0-54
 Architecture: all
 Maintainer: Clement Lefebvre <root@linuxmint.com>
 Installed-Size: 8
 Depends: linux-headers-4.15.0-54-generic, linux-image-4.15.0-54-generic, linux-modules-extra-4.15.0-54-generic, linux-firmware
 Section: kernel
 Priority: optional
 Description: The Linux kernel.
  This is a meta-package which points to the release kernel.


# 패키지 설치 파일 확인
dpkg -L linux-kernel-generic


# output
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/linux-kernel-generic
/usr/share/doc/linux-kernel-generic/changelog.Debian.gz
/usr/share/doc/linux-kernel-generic/copyright



사용자 계정명 변경

사용자 계정명을 변경하기 위해선 root 계정으로 접속 후 진행 필요함

# 사용자명 변경
# ex) usermod -l newname oldname
usermod -l hamonikr invesume

# 사용자 홈 디렉토리 변경
# ex) usermod -m -d /home/newname newname
usermod -m -d /home/hamonikr hamonikr

# 사용자명 그룹 변경
# ex) groupmod -n newname oldname
groupmod -n hamonikr invesume



usermod 'oldname' is currently used by process XXX

위와 같은 경우 기존 로그인 했던 유저이기 때문에 변경이 불가능한 경우 일 수 있다


이런 경우 재부팅 설정을 console 모드로 진입하여 root 계정으로 로그인하여 진행하면 된다



개요

타 업체에서 samba 공유폴더 mount 관련 기술지원 요청을 받아 진행하게 되었으며 해당 내용을 공유합니다.

https://help.ubuntu.com/community/Samba/SambaClientGuide 문서의 Connecting using CIFS 를 참고하여 진행



요청사항

  • 마운트한 공유폴더가 root 권한으로 변경되는데 read write 가 가능하도록 설정
  • 재부팅시 자동 마운트



사용자 권한으로 마운트

사용자 권한으로 마운트하여 read write 가 가능하도록 하는 방법입니다


# 사용자 권한으로 마운트
sudo mount -t cifs -o username=${samba-username},password=${samba-password},uid=$(id -u),gid=$(id -g),noexec //${sambaserver}/${samba-dir} ${mount-directory}


# 예시
# samba 사용자 : hamo
# samba 사용자 비밀번호 : 1234
# samba 서버 : 192.168.0.34
# samba 서버 공유폴더 : samba
# mount 디렉토리 : /mnt/local-dir
sudo mount -t cifs -o username=hamo,password=1234,uid=$(id -u),gid=$(id -g),noexec //192.168.0.34/samba /mnt/local-dir



마운트 폴더 및 파일 권한 변경

마운트한 폴더 및 파일의 권한을 변경하여 root 권한 이라도 사용자가 read write 가 가능하도록 하는 방법입니다


# 설정한 권한으로 마운트
sudo mount -t cifs -o username=${samba-username},password=${samba-password},dir_mode=${permission},file_mode=${file_permission},noexec //${sambaserver}/${samba-dir} ${mount-directory}


# 예시
# samba 사용자 : hamo
# samba 사용자 비밀번호 : 1234
# samba 서버 : 192.168.0.34
# samba 서버 공유폴더 : samba
# mount 디렉토리 : /mnt/local-dir
# mount 시 폴더 및 파일 권한 : 077
sudo mount -t cifs -o username=hamo,password=1234,dir_mode=0077,file_mode=0077,noexec //192.168.0.34/samba /mnt/local-dir



부팅시 자동 마운트

부팅시 마운트는 /etc/fstab 을 이용하면 가능합니다.

해당 파일 내용을 확인해 보면 아래와 같은 형식으로 나올 것 입니다.

UUID=e9bd0c09-c9ef-4f5e-9f8f-5b2e7f2373d0 /               ext4    errors=remount-ro 0       1
/swapfile                                 none            swap    sw                0       0
UUID=4E69-F594                            /boot/efi       vfat    defaults          0       1


samba 서버 공유 폴더를 부팅시 자동으로 마운트 되도록 진행해 보겠습니다.


진행하기에 앞서 samba 서버 사용자 정보를 별도의 파일로 분리하여 관리하도록 하겠습니다.

fstab 에서 해당 파일을 읽어들여 사용하도록 할 것입니다.


user 설정 파일 생성

/etc/samba/user 파일
# 서버 사용자 정보 파일 생성 - /etc/samba/user
# /etc/samba/user 내용
username=${samba_user}
password=${samba_user_password}

# 예시
# /etc/samba/user 내용
# samba 사용자 : hamo
# samba 사용자 비밀번호 : 1234
username=hamo
password=1234



생성한 user 파일을 불러들여 마운트 할 수 있도록 fstab 을 설정하도록 하겠습니다.


fstab 설정

# 부팅시 자동 마운트 설정 - /etc/fstab
# /etc/fstab 추가 내용
//${sambaserver}/${samba-dir}    ${mount-directory}    cifs    credentials=/etc/samba/user,noexec    0    0


# 예시1 - root 권한으로 마운트 하는 경우
# /etc/fstab 추가 내용
# samba 서버 : 192.168.0.34
# samba 서버 공유폴더 : samba
# mount 디렉토리 : /mnt/local-dir
//192.168.0.34/samba    /mnt/local-dir    cifs    credentials=/etc/samba/user,noexec    0    0


# 예시2 - 폴더 및 파일 권한을 777로 마운트 하는 경우(누구나 read write 가능)
# /etc/fstab 추가 내용
# samba 서버 : 192.168.0.34
# samba 서버 공유폴더 : samba
# mount 디렉토리 : /mnt/local-dir
//192.168.0.34/samba    /mnt/local-dir    cifs    credentials=/etc/samba/user,dir_mode=0777,file_mode=0777,noexec    0    0


exe 및 cab 파일 해제


EXE

# 설치
sudo apt-get install p7zip

# exe 해제
7zr e myexe.exe



Cab

# 설치
sudo apt-get install cabextract

# exe 해제
cabextract mycab.cab



wget



단일 파일 다운로드

wget download-url

# ex)
wget https://download-example.com/file/example



다른 이름으로 저장

wget -O file.zip https://download-example.com/file/example



다운로드 속도 지정

wget --limit-rate=200k DOWNLOAD-URL



이어받기

wget -c DOWNLOAD-URL



다운로드 가능한지 확인하기

# URL 이 이상 없는 경우
wget --spider http://www.openss7.org/repos/tarballs/strx25-0.9.2.1.tar.bz2 

## outprint
Spider mode enabled. Check if remote file exists. 
HTTP request sent, awaiting response... 200 OK 
Length: 3852374 (3.7M) [application/x-bzip2] 
Remote file exists.




# 에러가 있는 경우
wget --spider http://www.openss7.org/repos/tarballs/strx25 

## outprint
Spider mode enabled. Check if remote file exists. 
HTTP request sent, awaiting response... 404 Not Found 
Remote file does not exist -- broken link!!!



재시도 횟수 지정하기

wget --tries=75 DOWNLOAD-URL



여러개 파일 다운로드하기

wget -i FILE-WHICH-HAS-URLS



전체 웹 사이트 다운로드 받기

wget --mirror -p --convert-links -P ./LOCAL-PATH SITE-URL





su - $USERID -c "$COMMAND1; $COMMAND2; ... "

# EX
sudo su - hamonikr -c "echo \"HamoniKR 1.4 Update\" /home/hamonikr/Desktop/message.txt; firefox;"



bash 대소문자 변환


x="HELlo"
y=${x,,}
z=${x^^}

echo "x : $x"
echo "y : $y"
echo "z : $z"


# output
x : HELlo
y : hello
z : HELLO



사내 사이트에 적용된 SSL 인증서가 자동 갱신 되지 않는 문제 발생 하였습니다.

Letsencrypt 갱신 혹은 자동화 스크립트 문제라 생각되어 확인 하니 두가지 다 문제가 있었습니다.


자동화 스크립트의 경우 경로의 문제라 어렵지 않게 수정하였으나,

Letsencrypt의 경우 자동 인증을 위해 사용해야 하는 경로 및 포트가 있는데 기존 Apache 설정은 해당 경로마저 포트 포워딩하여 80, 443 포트를 사용할 수 없어 문제가 되었습니다.


이를 해결하기 위해 해당 경로로 접속하는 경우 포트포워딩 하지 않고 그 이외의 접속만 포워딩 하도록 변경할 필요가 있었습니다.


이를 위해 mod_rewrite 을 사용하기로 하였습니다. 

해당 문서는 mod_rewrite 에서 특정 uri 을 제외하고 리다이렉션을 적용하는 방법을 설명합니다.


  • 예외처리가 필요한 url : pms.invesume.com/.well-known/acme-challenge/*


# 포워딩 적용 대상
RewriteCond %{SERVER_NAME} =pms.invesume.com

# 예외 설정
# RewriteCond %{REQUEST_URI} ^/예외적용할uri/.*$
RewriteCond %{REQUEST_URI} ^/.well-known/acme-challenge/.*$

# 포워딩할 uri
RewriteRule ^ https://pms.invesume.com:444%{REQUEST_URI} [END,NE,R=permanent]



# 윈도우 cmd 창에서 실행

MD5
CertUtil -hashfile [filepath/name] MD5

SHA256
CertUtil -hashfile [filepath/name] SHA256



XE 서버 이전


※ 해당 문서는 ubuntu 18.04 서버를 기준으로 작성되었습니다.

※ DB 이전은 전체 DB를 이전하는 방식으로 적용하였습니다. 사용 중인 DB에 이전하는 경우 해당 DB만 이전하시기 바랍니다.



이전 준비

디렉토리 백업

tar -cvf xe_site.tar.gz $xe_site_path



DB 백업

mysqldump -u root -p --all-databases > all_db.sql


해당 두 파일 (xe_site.tar.gz, all_db.sql) 을 이전할 서버로 옮긴다





사전 설치

필수 패키지 설치

# php 설치 - v7.0
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.0 -y

sudo apt install php7.0-xml
sudo apt install php7.0-gd
sudo apt install php7.0-mysql

# files 폴더가 없는 경우 생성
mkdir files

# files 폴더 권한 변경
chmod 707 ./files


# mysql 설치 - v5.7
sudo apt-get install mysql-client-5.7
sudo apt-get install mysql-server-5.7


디렉토리 이전

mv xe_site.tar.gz $(설치할 경로)
cd $(설치할 경로)
tar -xvf xe_site.tar.gz

cd $(압축해제한폴더)
chmod 707 -R files



DB 이전

mysql -u root -p < all_db.sql



Apach2 설정

cd /etc/apache2/sites-available

# 설정파일 생성
vi $(설정파일명).conf


# 설정파일 내용
<VirtualHost *:80>
        ServerName $(url)
        ServerAdmin ****@****.com

        DocumentRoot $(xe path)

        ErrorLog ${APACHE_LOG_DIR}/log_file_name-error.log
        CustomLog ${APACHE_LOG_DIR}/log_file_name-access.log combined

        <Directory "$(xe path)">
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Require all granted
        </Directory>
</VirtualHost>


# 저장후 아래 명령 입력
sudo a2ensite $(설정파일명)
a2enmod rewrite

sudo service apache2 restart



확인

  • 브라우저에 도메인 입력 후 접속하여 확인





기타 오류 발생 시

DB 접속 오류가 발생했습니다. DB 정보를 입력해 주세요.

# DB 설정 변경
vi $(XE설치경로)/files/config/db.config.php

<?php if(!defined("__XE__")) exit();
$db_info = (object)array (
  'master_db' =>
  array (
    'db_type' => 'mysqli',
    'db_port' => '3306',
    'db_hostname' => 'localhost',     <---- 127.0.0.1 인 경우 localhost 로 변경한다.
    'db_userid' => 'root',
    'db_password' => '.....',
    'db_database' => '......',
    'db_table_prefix' => 'xe_',
  ),
  'slave_db' =>
  array (
    0 =>
    array (
      'db_type' => 'mysqli',
      'db_port' => '3306',






※ 해당 문서는 node js 에 대한 이해가 필요하며 node js에 대해선 다루지 않습니다.



certbot 설치

sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update

sudo apt-get install certbot





certbot 으로 SSL 인증서 생성을 위한 사이트 검증

sudo certbot certonly --manual

# output
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): 
# 프로토콜 부분 없이 도메인 이름을 입력
# ex : yourdomain.com


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
One or more of the entered domain names was not valid:

1: Requested name 1 is an IP address. The Let's Encrypt certificate authority
will not issue certificates for a bare IP address.

Would you like to re-enter the names?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: 
# Y


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E.1knlOBvZlzNYvhOwCYA_Zb1Oe4PyM5Xx6idZy92QVSQ

And make it available on your web server at this URL:

http://test.site/.well-known/acme-challenge/m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue


# 입력하지 않고 대기


위의 상태까지 진행하면 인증서를 발급 받기 전 유효한 사용자의 요청인지 확인하기 위한 준비가 끝났습니다.


다른 창으로 접속하여 인증서를 발급 받기 위한 준비를 진행합니다.


준비가 완료되면 위의 창으로 돌아와 엔터를 입력합니다.





사이트 인증 및 인증서 생성

인증서를 적용할 node js 디렉토리로 이동합니다.

해당 node js 에서 접근 가능한 경로에 폴더 및 파일을 생성합니다.

접근가능한 url 및 파일 내용은 다음과 같습니니다.

  • URL : http://test.site/.well-known/acme-challenge/m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E
  • 파일내용 : m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E.1knlOBvZlzNYvhOwCYA_Zb1Oe4PyM5Xx6idZy92QVSQ


URL 과 내용은 위에서 출력 되었던 내용입니다.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E.1knlOBvZlzNYvhOwCYA_Zb1Oe4PyM5Xx6idZy92QVSQ

And make it available on your web server at this URL:

http://test.site/.well-known/acme-challenge/m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


# 해당 작업이 완료되면 다음과 같은 구조를 가질 것 입니다.
service
├─ .well-known
│      └─ acme-challenge
│              └─ m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E
└─ service.js


완료되었다면 정상적인지 확인하기 위해 브라우저를 열고 URL 을 입력해 접속합니다.

  • URL : http://test.site/.well-known/acme-challenge/m7_68WkPyhNEZ6cCGF-5ywMJ3auDiy6N64-c667ph3E


브라우저가 파일을 다운로드 하며 해당 파일의 내용이 동일하다면 준비가 완료된 것 입니다.

만약 위와 같이 진행되지 않는 경우 처음부터 다시 시작해야 합니다.


모든 것이 정상이라면 위로 돌아가서 엔터를 입력합니다.

이상 없이 진행되었다면 완료되었다는 메시지와 함께 내용이 나올 것 입니다.





node js 에 인증서 적용하기

사이트에 인증서를 적용하도록 합니다.

다음의 코드를 server.js 에 반영합니다.

// Dependencies
const fs = require('fs');
const http = require('http');
const https = require('https');
const express = require('express');

const app = express();

// Certificate
const privateKey = fs.readFileSync('/etc/letsencrypt/archive/yourdomain.com/privkey.pem', 'utf8');
const certificate = fs.readFileSync('/etc/letsencrypt/archive/yourdomain.com/cert.pem', 'utf8');
const ca = fs.readFileSync('/etc/letsencrypt/archive/yourdomain.com/chain.pem', 'utf8');

const credentials = {
	key: privateKey,
	cert: certificate,
	ca: ca
};

app.use((req, res) => {
	res.send('Hello there !');
});

// Starting both http & https servers
const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);

httpServer.listen(80, () => {
	console.log('HTTP Server running on port 80');
});

httpsServer.listen(443, () => {
	console.log('HTTPS Server running on port 443');
});


적용이 완료되면 서버를 구동(혹은 재시작)한 뒤 브라우저로 접속해 SSL 인증서 적용을 확인합니다.


※ 인증서 적용이 되지 않는다면 해당 인증서 및 인증서 디렉토리 권한을 확인해 보시기 바랍니다.

※ 간혹 적용이 되었으나 브라우저에서 갱신이 느린 경우가 있습니다. 이상이 없는데 적용이 안되는 경우 다른 브라우저로 접속해서 확인해 보시기 바랍니다.