Thursday, July 30, 2020

Making GIF of iOS Simulator without additional apps

This is how I did it.

First, you need to open Terminal and execute this command:

```
xcrun simctl io booted recordVideo \
--code=h264 \
--force "$( date +%Y%m%d%H%M%S ).mov"

```

Running this will record the Simulator screen until you press `Control+C`. The filename will be something like `20200730095757.mov`. The next step is to convert this video into GIF, FFMPEG is required for this. You can either install it via Homebrew but I prefer running it in a Docker container, something like this:

```
docker run --rm -it -v $PWD:/data -w /data --entrypoint /bin/bash jrottenberg/ffmpeg
```

Once you have FFMPEG installed or are inside the container, execute this command:

```
ffmpeg -i 20200730095757.mov \
-vf "fps=fps=5,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
20200730095757.gif

```

I have played around with the command line arguments and came up with those. Basically it will create a decent GIF to use in issue report etc. Because of the low frame rate, it won't be very smooth but the filesize is acceptable. See these additional links to tweak it further if you want to:


Demo:

Monday, March 16, 2020

Running phpinfo to test Kubernetes ingress and Let's Encrypt certificate

For new cluster, I usually deploy a simple phpinfo app to test that the happy-path works as expected. The PHP service and deployment is pretty simple:


The Docker image is basically a php:apache image with a single index.php file.

Next, setup the ingress and issuer (I'm using ingress-nginx and cert-manager FYI):


And voila.

Friday, February 28, 2020

Amazon SES notes

Amazon IAM policy to restrict sending email from a single address

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ses:SendRawEmail",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "ses:FromAddress": "username@domain.com"
        }
      }
    }
  ]
}

Replace `username@domain.com` with `*@domain.com` to allow sending from any addresses.

Generate SMTP password from the secret access key

Official document is available at docs.aws.amazon.com. Usage is like this:

./ses.py --secret DmxxxOY --region us-west-2


Test SMTP credentials

I use the swaks script (source: wiert.me):

brew install swaks

swaks -tls --to xxx@gmail.com \
  --from username@domain.com \
  --server email-smtp.us-west-2.amazonaws.com \
  --auth-user AKxxxOP


If everything is setup correctly, you should receive the test email in your inbox.


Saturday, January 4, 2020

Configure XenForo 2 to use FTP adapter for external and internal data storage

XenForo 1 needs an add-on to use remote storage for data (useful in container environments) but XenForo 2 supports FTP out of the box. Just put something like these in config.php:

$config['fsAdapters']['data'] = function () {
    return new \League\Flysystem\Adapter\Ftp([
        'host' => 'ftp.domain.com',
        'password' => 'password',
        'username' => 'data',
    ]);
};
$config['externalDataUrl'] = function ($externalPath, $canonical) {
    return 'https://data.domain.com/' . $externalPath;
};

$config['fsAdapters']['internal-data'] = function () {
    return new \League\Flysystem\Adapter\Ftp([
        'host' => 'ftp.domain.com',
        'password' => 'password',
        'username' => 'internal_data',
    ]);
};

Saturday, July 22, 2017

Cord cutting là gì và vì sao mình chọn không dùng truyền hình cáp

Ngày xửa ngày xưa, mua tivi xong chỉ cần cắm ăngten râu vào cái lỗ tròn tròn là xem được Tây du ký. Sau đấy sờ râu với cắm lại đủ kiểu mà xem Cảnh sát hình sự vẫn nhiễu nên từ đó mặc định có tivi là lắp luôn truyền hình cáp (hồi đầu là 45k/tivi/tháng, toàn trả tiền một cái nhưng cho thêm anh lắp đặt ít tiền để ảnh làm giùm bộ tách, xem thêm ở hai ba tivi nữa). Ngày nảy ngày nay, cáp rồi nhưng còn quẩy thêm bộ giải mã để xem các kênh hát đê (cái cục thì có thể tặng nhưng tiền gói thì thêm 50k/tivi/tháng). Đến khổ, càng hiện đại thì càng ăn tiền 😭

Năm ngoái, đứng trước quyết định vô cùng lớn lao khi... lắp tivi, vợ chồng mình đã dấn thân vào con đường khá mới mẻ và (có lẽ) trở thành một trong những cord cutters tiên phong ở Sài Gòn! Hiểu theo nghĩa đen thì cord cutting là việc cầm kéo cắt cái dây truyền hình cáp cái bụp. Sở dĩ không xài truyền hình cáp vì bọn mình thấy bỏ ra một khoản tiền vài trăm ngàn một tháng cho cáp là không hề cần thiết. Mang tiếng là có hàng trăm kênh nhưng thực tế số lượng các kênh chúng ta thường xuyên xem chỉ đếm trên đầu ngón tay, còn lại chẳng bao giờ động đến. Đối với bọn mình các kênh truyền hình của Việt Nam thì một là hài nhảm hai là tuyên truyền, kênh nước ngoài thì bọn mình cũng chỉ xem phim, mà các phim trên cáp thường cũ, chiếu đi chiếu lại rất nhiều lần, cùng lắm là chỉ có thể dùng để giết thời gian. Đối với nhu cầu xem phim thì một là bọn mình ra rạp, hai là sử dụng các dịch vụ xem phim theo yêu cầu có trả phí, nên cũng không cần các kênh của truyền hình cáp. Không có cáp nhưng vẫn có hai tivi nên là công cuộc xem-tivi-không-có-cáp bắt đầu...

Chromecast

Từ lúc còn ở Hà Nội mình đã trang bị Chromecast cho mấy cái tivi ở nhà rồi nên đương nhiên là cả hai chiếc ở đây đều có. Chiếc ở phòng khách thì xài Chromecast 2, chiếc ở phòng ngủ thì Chromecast, về cơ bản thì xài không thấy khác gì hết.

Chromecast 1
Chromecast 1 -- ổ cứng USB cỡ bự.
Nói cho bạn nào chưa biết: Chromecast là một thiết bị nhỏ nhỏ, gắn vào cổng HDMI, tác dụng là phát ra nội dung số (ảnh, phim, nhạc) từ các nguồn khác nhau trên tivi.

Chromecast 2
Bản 2 -- tròn tròn xinh xinh yêu yêu.

Trước cũng có nghiên cứu Android Box, thấy mấy bạn này mạnh hơn nhưng mất công cài đặt phần mềm, thiết lập tùm lum, cập nhật hệ thống với lại có quá nhiều lựa chọn từ quá trời nhà sản xuất nên từ bỏ luôn, chưa xài bao giờ 😅. Ngoài ra có cả Apple TV nghe nói cũng ngon mà mắc quá + hỗ trợ không được nhiều bằng nên mình cũng chưa được thử.

Giải trí hàng ngày

Chromecast xài ngon nhất là với các dịch vụ hỗ trợ nó trực tiếp. Ý tưởng của Google nên hàng của Google cũng là ngon nhất: YouTube, Google Photos, Google Play Movies, etc. Ví dụ như YouTube, kiếm video nào muốn coi:


Bấm cái nút Cast ở thanh trên cùng (cái nút có hình chữ nhật và biểu tượng phát sóng), hiện lên danh sách các thiết bị có thể xem:


Nhà mình có hai cái, một em tên là Arya, một em tên là Sansa 💪. Sansa mình gắn ở phòng khách, lúc nào cũng cắm điện nên khi nào muốn xem chỉ cần chọn nó là tivi sẽ tự bật luôn. Còn Arya để ở phòng ngủ, ít xem hơn, cắm nguồn qua cổng USB của tivi nên khi nào xem thì phải bật tivi, đợi Chromecast khởi động một chút rồi mới xem được. Từ danh sách thiết bị, bấm tên Chromecast là xem thôi:


Có thể thêm nhiều video vào hàng đợi để xem tiếp tục sau đó. YouTube có chức năng Autoplay cũng hay, mình chỉ cần chọn 1 video của Hà Anh Tuấn là nó cứ thế chơi tất cả các bài của ảnh luôn. Ngoài YouTube mình hay xài nhất thì mình cũng đã xài chức năng Cast ở các ứng dụng sau:
  • Google Photos: muốn xem ảnh / video nào thì bấm vào nó trong danh sách thì sẽ phát trên tivi. Lúc quay lại danh sách xem thì tivi vẫn hiển thị nội dung cũ nên yên tâm không bị lộ ảnh nóng trừ khi cố tình bấm nhầm 🤡
  • Facebook: gần đây mới có chức năng Cast, hỗ trợ cả Chromecast và Apple TV. Lúc xem video có biểu tượng cái tivi, bấm vô chọn là được. Hỗ trợ cả xem trực tiếp luôn, hiện reactions với comments trên tivi đầy đủ. Nói chung trải nghiệm rất tốt 😇
  • Netflix/iflix: chuyên xài để xem phim nước ngoài. Chắc máy chủ nước ngoài nên thỉnh thoảng mạng chậm thì xem chất lượng thấp hoặc giật giật hơi khó chịu tí. Còn lại thì cũng dễ sử dụng, xài ngon.
  • Fim+: hay có phim Việt Nam sớm (giờ đã có "Em chưa 18", ra rạp cuối tháng 4), thuê lẻ khoảng 50k/phim xem trong 2 ngày. Hồi mới ra mình có thuê thử "Vòng eo 56" nhưng kết nối với Chromecast mãi không được, gọi lên tổng đài hỗ trợ đòi lại tiền thì các bạn ấy hỗ trợ qua lại 2-3 ngày xong không giải quyết được và cũng xù luôn. Nhưng giờ thì cast ngon lành rồi nhé.

Xem truyền hình

Lúc quyết định không lắp truyền hình cáp thì nghĩ là chả bao giờ xem truyền hình nhưng thực ra thỉnh thoảng cũng cần xem, ví dụ như "Sống chung với mẹ chồng" với cả "Người phán xử" 😝 Mình thì cũng không xem đá bóng nên cũng ít cần truyền hình hơn. Sau một thời gian thử nghiệm các kiểu thì đây là kết quả tổng hợp:
  • Clip TV: ứng dụng này chắc là mới nhất trong nhóm, mà cũng mới có hỗ trợ Chromecast thôi chứ lúc ra mắt thì chưa có. Ứng dụng ổn, giá rẻ (50k/tháng), xem nhanh, chất lượng cao, có thể tua để xem lại. Điểm trừ: trong các kênh của VTV thì chỉ có VTV1. Cái này chắc do VTV mới giới hạn chứ mình nhớ hồi đầu thì có đủ các kênh.
  • FPT Play: dịch vụ gần tương tự Clip TV, cũng có phim với truyền hình. Điểm cộng là xem truyền hình không cần đăng ký gói dịch vụ. Điểm trừ là cũng chỉ có VTV1 (không xem được Người khó xử) + không xem lại được.
  • VTVgo: ứng dụng của nhà đài, có lẽ là vô địch để xem các kênh của VTV (có đủ các kênh, tất nhiên rồi). Điểm trừ là đã chọn Chromecast rồi nhưng trên ứng dụng vẫn tiếp tục phát, lỗi này bị ở cả Android lẫn iOS. Điểm trừ nữa là đang xem thỉnh thoảng bị lặp 2-3 giây, cực kì khó chịu nếu xem phim, kiểu bị déjà vu ý. Ngoài ra thì có những thời điểm không vào được để xem, chắc do có nhiều người xem qua (lúc bị thường là trước giờ phim hot).
  • myK+: ứng dụng miễn phí cho người lắp K+ còn không thì là 125k/tháng, khá là đắt. Điểm cộng là có các kênh của K+ (xem thể thao thì thôi rồi) và đầy đủ kênh của VTV, không có các kênh phim xịn như HBO/StarMovies nhé. Quảng cáo là hỗ trợ Chromecast nhưng đến khi tìm hiểu kĩ thì hoá ra hướng dẫn người dùng xài chức năng Cast Screen / Cast Tab, thua luôn ahihi.

Cái khó ló cái khôn

Nói vậy thôi chứ số lượng dịch vụ hỗ trợ Chromecast vẫn là muối bỏ bể, nhiều cái muốn xem mà nó chả hỗ trợ gì cả. Chả lẽ bó tay?

Tất nhiên là không rồi! Trên máy tính có thể xài trình duyệt Google Chrome để Cast Tab, bất kì trang web nào cũng lên được tivi hết. Hồi trước còn hay bị giật / tiếng chậm hơn hình chứ gần đây đã ngon hơn nhiều rồi. Chrome cũng đang thử nghiệm chức năng Media Remoting, nếu được bật thì khi xem video toàn màn hình ở trong tab, video sẽ không play trên máy tính luôn mà phát thẳng lên tivi, đảm bảo mượt. Cast Tab có cái dở nhất là phải để máy tính chạy trong lúc xem trên tivi, nhiều khi bất tiện hoặc quên, tắt máy tính là tèo.

Trên điện thoại thì có nhiều ứng dụng hỗ trợ nhưng mình thì xài Web Video Caster cho Android. Muốn xem cái gì trên tivi thì mở trang web của nó:

Web Video Caster, phimmoi.net
Nút Play hiện ở trên, bấm vô để phát trên tivi.

Web Video Caster, 720p
Chọn video muốn phát, thường thì các trang web hỗ trợ nhiều mức chất lượng.
Cứ nhắm cái cao nhất, ở đây là 720p, để xem là được.

Sơ sơ vậy là cũng đủ các nhu cầu giải trí rồi ha. Tóm tắt cho bạn nào chưa đọc cả bài: xem VTV thì xài VTVgo (miễn phí), xem bóng đá thì xài myK+ (125k/tháng), còn lại xài Web Video Caster hoặc các ứng dụng tương tự nhé 👍

Tuesday, March 28, 2017

Facebook author metatag and app-scoped ID

Not sure if this is a bug or the desired behavior but apparently Facebook does not understand their own app-scoped user ID if it is used in a "article:author" meta tag. Debugging the page will yield an error that says the provided value (http://facebook.com/some-app-scoped-id/) is not a profile. Of course if you go to that url, it will redirect to the correct user profile page. It just doesn't work for sharing, probably for security reason.

In our case, we have to let user enter their own username/id and use that for the meta tag. Not the best user friendly experience but it works for now...

Sunday, July 24, 2016

Vọc thử các ứng dụng ngân hàng trực tuyến

Nhân dịp vấn đề an toàn giao dịch ngân hàng trực tuyến đang nóng, mình làm một vài bài thử nghiệm với các dịch vụ của 5 ngân hàng lớn trong nước: BIDV, Vietcombank, ACB, Techcombank và Sacombank. Các bài thử nghiệm sẽ là (hoặc tua xuống cuối bài để xem nhanh nên xài ngân hàng nào thì an toàn :P):
  1. Trang web
    • TLS: phải bật
    • SSL Server Test: phải từ A trở lên
    • HPKP: phải sử dụng
    • hoặc phải mã hóa tên và mật khẩu bằng Javascript trước khi đăng nhập
  2. Ứng dụng di động: lúc đầu mình tính kiểm tra riêng Android và iOS nhưng thực tế thấy ứng dụng mỗi ngân hàng ở hai nền tảng khá giống nhau nên gom lại chung cho gọn

Giới thiệu

TLS trước đây còn có rào cản về chi phí tuy nhiên gần đây đã có chứng chỉ miễn phí từ Let's Encrypt nên không còn lý do gì nữa để không làm việc này. TLS là bước cơ bản nhất để bảo mật thông tin giữa ngân hàng và người sử dụng.

SSL Server Test là bài kiểm tra máy chủ web bao gồm phần mềm, cấu hình TLS và chứng chỉ. Bài kiểm tra này sẽ cho điểm trang web, tối đa là điểm A. Điểm càng cao càng tốt.

HPKP là một phần mở rộng cho HTTP cho phép các trang web bảo vệ mình khỏi các cuộc tấn công dạng MITM (man in the middle / người trung gian). Cách tấn công này nôm na là kẻ tấn công can thiệp vào giữa kết nối của người dùng và ngân hàng sau đó bí mật ngăn chặn và thay đổi thông tin qua lại giữa hai bên. HPKP vẫn còn khá mới và chưa được hỗ trợ rộng khắp, người dùng cần sử dụng phiên bản khá mới của các trình duyệt để được bảo vệ (ví dụ: Chrome 46, Firefox 35 trở lên).

Certificate/Public Key Pinning có ý tưởng gần giống HPKP nhưng thay vì thực hiện kiểm tra ở trình duyệt thì mỗi ứng dụng tự kiểm tra khi kết nối với máy chủ. Do ứng dụng được phát hành bởi chính ngân hàng nên đội phát triển có thể nắm rõ máy chủ ngân hàng sử dụng chứng chỉ gì, phát hành bởi đơn vị nào, từ đó thực hiện Pinning đảm bảo thông tin của người sử dụng không bị lộ với bên thứ ba.

Trong trường hợp không sử dụng Pinning thì ứng dụng cần phải mã hóa tất cả các thông tin nhạy cảm như tên, mật khẩu đăng nhập theo cả hai hướng (gửi lên / nhận về) để bảo vệ người sử dụng.

Kết quả

Mỗi bước kiểm tra có thể có kết quả là:
  • PASS
  • BAD: yêu cầu nên có mà không sử dụng
  • FAIL: yêu cầu phải có mà không sử dụng

Trang web

  • TLS: có PASS
  • SSL Server Test: không kiểm tra được do HTTPS cổng 81
  • HPKP: không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được mật khẩu (xài base64) FAIL
  • TLS: có PASS
  • SSL Server Test: A PASS
  • HPKP: không cài đặt BAD
  • Mã hóa: không thực hiện FAIL

  • TLS: có PASS
  • SSL Server Test: B FAIL
  • HPKP: không cài đặt BAD
  • Mã hóa: không thực hiện FAIL
Trang web của ACB bị điểm B vì nhiều lý do tuy nhiên nặng nhất là do cấu hình phần mềm đang hỗ trợ một công nghệ đã cũ và có điểm yếu (DH, chi tiết xem thêm trang tổng hợp về ACB tại SSL Labs).

  • TLS: có PASS
  • SSL Server Test: A- PASS
  • HPKP: không cài đặt BAD
  • Mã hóa: không thực hiện FAIL
  • TLS: có PASS
  • SSL Server Test: A- PASS
  • HPKP: không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được tên đăng nhập PASS

Ứng dụng di động

BIDV (Android, iOS)
  • TLS: có PASS
  • Pinning (ebank.bidv.com.vn): có PASS
Ứng dụng BIDV (iOS) thực hiện Pinning
và báo lỗi kết nối trong trường hợp bị tấn công

Vietcombank (AndroidiOS)
  • TLS: có PASS
  • Pinning (vcbmobilebankingp2.smartlink.com.vn): không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được tên đăng nhập PASS

ACB (AndroidiOS)
  • TLS: có PASS
  • Pinning: không cài đặt BAD
  • Mã khóa: không thực hiện FAIL
adapter=ACBAdapter&procedure=submitAuthentication&compressResponse&parameters=%5B%7B%22username%22%3A%220901234567%22%2C%22password%22%3A%22qwerty1%22%2C%22device%22%3A%22xxx%22%2C%22ip%22%3A%22xxx%22%7D%5D&__wl_deviceCtx=xxx&isAjaxRequest=true&x=xxx
Ứng dụng của ACB ngoài ra còn thực hiện tự cập nhật sau khi cài đặt từ kho ứng dụng, mặc dù dữ liệu cập nhật có vẻ được mã hóa tuy nhiên do không Pinning nên kẻ xấu rất có thể vẫn có cách chèn mã độc vào quá trình cập nhật này.


Techcombank (AndroidiOS)
  • TLS: có PASS
  • Pinning (m.techcombank.com.vn): không cài đặt BAD
  • Mã khóa: không thực hiện FAIL
{"origin":"MAPP","traceNo":"xxx","AuditData":{"device":"xxx","deviceId":"xxx","otherDeviceId":"xxx","application":"MAPP","applicationVersion":"1.1.2.5"},"identification":"0901234567","credential":"qwerty1","identificationType":"0","credentialType":"0","UnstructuredData":[{"Key":"DeviceToken","Value":"xxx"}]}

Sacombank (Android, iOS)
  • TLS: có PASS
  • Pinning (www.msacombank.com.vn): không cài đặt BAD
  • Mã hóa: có nhưng vẫn có thể lấy được tên đăng nhập PASS

Kiểm tra thêm

Mình cũng hơi rảnh nên quyết định thử thêm Citibank với HSBC.

  • Citibank Vietnam Web
    • TLS: có
    • SSL Test A-
    • Không có HPKP
    • Không mã hóa khi gửi thông tin
    • Tổng kết: FAIL
  • Citibank Vietnam (Android, iOS)
    • TLS: có
    • Pinning (mobile.citibank.com.vn): không
    • Mã hóa: có
    • Tổng kết: PASS
    • Ứng dụng này dùng WebView mà không Pinning nên có thể tấn công bằng cách chèn mã độc vào các đoạn Javascript khi tải ứng dụng.
  • HSBC Vietnam Web
    • TLS: có
    • SSL Test C (chứng chỉ + thuật toán yếu)
    • Không có HPKP
    • Không mã hóa khi gửi thông tin 
    • Tổng kết: FAIL
  • HSBC (Android, iOS)
    • TLS: có
    • Pinning (services.mobile.hsbc.com + www.hsbc.com.vn): có
    • Tổng kết: PASS
    • Ứng dụng này của HSBC toàn cầu, mình chọn kết nối vào HSBC Việt Nam thì thấy ứng dụng áp dụng Pinning cho cả hai máy chủ luôn. Tuy vậy vẫn có một số thông tin theo dõi người dùng (sử dụng mạng gì, thiết bị gì, đang vào trang nào) có thể bị nghe lén (máy chủ dc.webtrends.com)

Thông báo lỗi của ứng dụng HSBC khi bị tấn công

Kết luận


Như vậy là chỉ có 1 trang web qua được bài kiểm tra (Sacombank) và cả 5 trang đều không xài HPKP. Như đã nói ở trên, đây là chức năng khá mới và đa số người dùng cũng chưa sử dụng trình duyệt phiên bản đủ mới để hưởng lợi từ việc này. Trên thế giới cũng còn nhiều trang web tài chính chưa bắt đầu sử dụng HPKP (ví dụ như PayPal, HSBC US).

Về ứng dụng di động, 2 ứng dụng không qua được bài kiểm tra (ACBTechcombank) và 1 ứng dụng duy nhất có sử dụng kỹ thuật Pinning là BIDV.

Bảng xếp hạng chung cuộc:
  1. Sacombank: chưa áp dụng các công nghệ mới nhất nhưng vẫn an toàn
  2. BIDV, Vietcombank: ứng dụng của ngân hàng này an toàn hơn web của họ
  3. ACB, Techcombank: về chót. Nên hạn chế sử dụng nếu đang kết nối qua mạng công cộng (wifi quán cà phê, wifi không bảo mật).
Bài này đã được thay đổi do lỗi khi chạy thử web của BIDV dẫn đến thay đổi thứ tự bảng tổng kết cuối cùng (kết quả cũ là BIDV số 1, kết quả cập nhật là Sacombank vượt lên!).

Xem thảo luận + gạch đá ở tinhte.vn.